首頁 >後端開發 >php教程 >詳述file_get_contents、getimagesize嚴重耗時問題

詳述file_get_contents、getimagesize嚴重耗時問題

藏色散人
藏色散人轉載
2023-04-23 17:36:202122瀏覽

file_get_contents、getimagesize嚴重耗時問題

1、場景及問題描述

第三方首次登入(QQ、微信)時,自動將平台使用者頭像更換為第三方頭像,相關程式碼如下

$logo = "http://thirdqq.qlogo.cn/g?b=oidb&k=OMu7e7tukTueShatFXVX1w&kti=ZDyqNAAAAAE&s=100&t=1611112388"
try {
    $fileContent = file_get_contents($logo);
} catch (\Exception $e) {
    throw new \Exception("读取文件[" . $logo ."]失败");
}

$imageInfo = getimagesize($logo);
if (empty($imageInfo)) {
    throw new \Exception("文件[" . $logo ."]格式有误(非图片)");
}
$base64Image = 'data:' . $imageInfo['mime'] . ';base64,' . base64_encode($fileContent);

結果在取得到QQ用戶頭像,用file_get_contents()取得頭像檔案內容時,耗時18到20秒

#後來在網路上找一番說可以設定超時

$context = stream_context_create([
    'http' => [
        'timeout' => 3 //超时时间,单位为秒
    ]
]);  
// Fetch the URL's contents 
$fileContent = file_get_contents($logo, 0, $context);

然而並沒有用,3秒超時沒有生效

2、解決辦法

更換使用GuzzleHttp或PHP自己的curl取得頭像內容,結果沒有超時

$logo = "http://thirdqq.qlogo.cn/g?b=oidb&k=OMu7e7tukTueShatFXVX1w&kti=ZDyqNAAAAAE&s=100&t=1611112388"
try {
    $client = new Client(['timeout' => 3]);
    $fileContent = $client->get($logo)->getBody()->getContents();
} catch (\Exception $e) {
    throw new \Exception("读取文件[" . $logo ."]失败");
}

$imageInfo = getimagesize($logo);
if (empty($imageInfo)) {
    throw new \Exception("文件[" . $logo ."]格式有误(非图片)");
}
$base64Image = 'data:' . $imageInfo['mime'] . ';base64,' . base64_encode($fileContent);

但是呢,有一個耗時的發現來了,getimagesize函數耗時也是18到20秒

頭像內容已經正常獲取到了,PHP還有一個通過圖片內容取得mime的函數,即getimagesizefromstring

$logo = "http://thirdqq.qlogo.cn/g?b=oidb&k=OMu7e7tukTueShatFXVX1w&kti=ZDyqNAAAAAE&s=100&t=1611112388"
try {
    $client = new Client(['timeout' => 3]);
    $fileContent = $client->get($logo)->getBody()->getContents();
} catch (\Exception $e) {
    throw new \Exception("读取文件[" . $logo ."]失败");
}

$imageInfo = getimagesizefromstring($logo);
if (empty($imageInfo)) {
    throw new \Exception("文件[" . $logo ."]格式有误(非图片)");
}
$base64Image = 'data:' . $imageInfo['mime'] . ';base64,' . base64_encode($fileContent);

自此問題解決。

推薦學習:《PHP影片教學

以上是詳述file_get_contents、getimagesize嚴重耗時問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除