ホームページ > バックエンド開発 > PHPチュートリアル > file_get_contents と getimagesize の時間のかかる深刻な問題の詳細な説明

file_get_contents と getimagesize の時間のかかる深刻な問題の詳細な説明

藏色散人
リリース: 2023-04-23 17:38:02
転載
2061 人が閲覧しました

file_get_contents、getimagesize 時間のかかる深刻な問題

1. シナリオと問題の説明

サードパーティが初めてログインするとき (QQ、WeChat) 、プラットフォーム ユーザーのアバターは自動的にサードパーティのアバターに変更されます。関連するコードは次のとおりです。

$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 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
php
ソース:learnku.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート