Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Beschreibung des schwerwiegenden zeitaufwändigen Problems von file_get_contents und getimagesize

Detaillierte Beschreibung des schwerwiegenden zeitaufwändigen Problems von file_get_contents und getimagesize

藏色散人
藏色散人nach vorne
2023-04-23 17:36:202007Durchsuche

file_get_contents, getimagesize ernstes zeitaufwändiges Problem

1. Szenario und Problembeschreibung

Erstanmeldung von Drittanbietern (QQ, WeChat) Wenn der Plattformbenutzer-Avatar automatisch durch einen Drittanbieter-Avatar ersetzt wird, lautet der relevante Code wie folgt:

$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);

Das Ergebnis ist, dass beim Abrufen des QQ-Benutzer-Avatars file_get_contents() zum Abrufen verwendet wird Der Inhalt der Avatar-Datei dauert 18 bis 20 Sekunden. Das 3-Sekunden-Timeout wurde nicht wirksam.

2. Lösung#🎜#

Ersetzen Sie es mit GuzzleHttp oder PHPs eigenem Curl, und das Ergebnis ist kein Timeout#🎜 🎜#
$context = stream_context_create([
    'http' => [
        'timeout' => 3 //超时时间,单位为秒
    ]
]);  
// Fetch the URL's contents 
$fileContent = file_get_contents($logo, 0, $context);

Es gibt jedoch eine zeitaufwändige Entdeckung, die Funktion getimagesize dauert ebenfalls 18 bis 20 Sekunden.

Der Avatar-Inhalt wurde auch normal abgerufen. PHP verfügt auch über eine Funktion zum Abrufen mime durch den Bildinhalt, nämlich 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 = getimagesize($logo);
if (empty($imageInfo)) {
    throw new \Exception("文件[" . $logo ."]格式有误(非图片)");
}
$base64Image = 'data:' . $imageInfo['mime'] . ';base64,' . base64_encode($fileContent);

Dieses Problem wurde gelöst.

Empfohlenes Lernen: „

PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonDetaillierte Beschreibung des schwerwiegenden zeitaufwändigen Problems von file_get_contents und getimagesize. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen