>  기사  >  백엔드 개발  >  file_get_contents 및 getimagesize의 심각한 시간 소모 문제에 대한 자세한 설명

file_get_contents 및 getimagesize의 심각한 시간 소모 문제에 대한 자세한 설명

藏色散人
藏色散人앞으로
2023-04-23 17:36:202006검색

file_get_contents, getimagesize 시간이 많이 걸리는 문제

1. 시나리오 및 문제 설명

제3자가 처음 로그인하면(QQ, WeChat) 플랫폼 사용자 아바타가 자동으로 제3자 아바타로 대체됩니다. 해당 코드는 다음과 같습니다

$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 자체 컬을 사용하여 아바타 콘텐츠를 가져왔고 결과는 타임아웃이 없습니다

$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으로 문의하시기 바랍니다. 삭제