Maison >développement back-end >tutoriel php >Description détaillée du problème sérieux et fastidieux de file_get_contents et getimagesize

Description détaillée du problème sérieux et fastidieux de file_get_contents et getimagesize

藏色散人
藏色散人avant
2023-04-23 17:36:202119parcourir

file_get_contents, getimagesize problème sérieux qui prend du temps

1. Scénario et description du problème

Lorsqu'un tiers se connecte pour la première fois (QQ, WeChat), l'avatar de l'utilisateur de la plateforme est automatiquement remplacé par un avatar tiers. . Le code pertinent est le suivant

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

Le résultat est dans L'obtention de l'avatar de l'utilisateur QQ et l'utilisation de file_get_contents() pour obtenir le contenu du fichier de l'avatar ont pris 18 à 20 secondes

Plus tard, j'ai effectué une recherche en ligne et j'ai dit que je pouvais définir un délai d'attente.

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

Cependant, cela n'a pas fonctionné. Le délai d'attente de 3 secondes n'a pas pris effet

2, solution

Remplacez en utilisant GuzzleHttp ou le propre curl de PHP pour obtenir le contenu de l'avatar, et le résultat n'est pas de délai d'attente

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

Mais, il y a une découverte qui prend du temps, la fonction getimagesize prend également 18 à 20 secondes

Le contenu de l'avatar est normal. Obtenu, PHP a également une fonction pour obtenir du mime via le contenu de l'image, à savoir 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);

Ce problème a été résolu.

Apprentissage recommandé : "Tutoriel vidéo PHP"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer