У меня есть длинная функция, которая использует 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 часто меняется, как раз в час.
В ситуации, когда фрагмент кода может не работать должным образом, будь то из-за ошибки или исключения, вы можете использовать операторы 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
...
...
...
...
}
Других решений пока нет …