第三方首次登入(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秒超時沒有生效
更換使用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中文網其他相關文章!