imagecreatefromjpeg проблема тайм-аута

У меня есть длинная функция, которая использует imagecreatefromjpeg(),

function myFunction() {
...
...
$im = imagecreatetruecolor(600, 400);
$myImage = imagecreatefromjpeg("http://example.com/file.jpeg");
imagecopy($im, $myImage , 5, 5, 0, 0, 48, 48);
...
...
...
...
}

Я загружаю файл JPEG с удаленного URL. Так что из-за нагрузки на сервер иногда я получаю:

Warning: Warning (2): imagecreatefromjpeg(http://example.com/file.jpeg):
failed to open stream: Connection timed out in
[/var/www/vhosts/example2.com/httpdocs/myfile.php, line 1851]

Все время выполнения тратится на этот файл, поэтому запрос становится безуспешным для остальной части моей функции

Несмотря на то, что мне нужно загрузить файл в формате JPEG, запуск оставшегося кода для меня приемлем.

Я ищу такое решение:
— Попробуйте это: создать изображение из файла JPEG
— Если не удалось через 5 секунд, пропустите
— Запустите оставшийся код.

Редактировать:
— Я иногда получаю эту ошибку. Большая часть запросов выполнена успешно. Так что allow_url_fopen не проблема.
— Этот файл JPEG часто меняется, как раз в час.

0

Решение

В ситуации, когда фрагмент кода может не работать должным образом, будь то из-за ошибки или исключения, вы можете использовать операторы try / catch для решения проблемы. Таким образом, если ваш код по какой-либо причине ломается или не работает, вы можете запрограммировать способ обработки данной ошибки или исключения.

Однако try / catch работает только на Исключения, а также imagecreatefromjpeg() выдает предупреждение, которое является типом ошибки. Вы можете решить это с помощью set_error_handler() превратить ошибки в исключения! (см. этот поток StackOverflow для получения дополнительной информации)

Вверху вашего php-файла вставьте

set_error_handler(function($errno, $errstr, $errfile, $errline, array, $errcontext) {
// error was suppressed with the @-operator
if (0 === error_reporting()) {
return false;
}

throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
});

В вашей функции вы можете сделать:

function myFunction() {
...
...
try{
$im = imagecreatetruecolor(600, 400);
$myImage = imagecreatefromjpeg("http://example.com/file.jpeg");
imagecopy($im, $myImage , 5, 5, 0, 0, 48, 48);
} catch (ErrorException $ex){
// Do Nothing
// Or Handle the error somehow
}
// Code continues to run
...
...
...
...
}
1

Другие решения

Других решений пока нет …