Я пытаюсь поймать следующую ошибку из-за функции imagecreatefromjpeg.
Поврежденные данные JPEG: преждевременный конец сегмента данных
Я не хочу отображать эту ошибку в выводе моего PHP-скрипта, поэтому я пытаюсь использовать ob_start и ob_get_contents, но это не работает. Цель состоит в том, чтобы уловить эту ошибку, чтобы узнать, какие изображения повреждены.
Вот мой код:
ob_start();
$img = imagecreatefromjpeg($imgDestinationPath);
$output = ob_get_contents();
echo "test";
ob_end_clean();
if( $output == "Corrupt JPEG data: premature end of data segment" )
{
$this->log("The following image is corrupted : $imgDestinationPath");
}
var_dump($output);
Выход :
Поврежденные данные JPEG: преждевременный конец сегмента данных
строка (4) «тест»
Поврежденное изображение:
Любые идеи относительно того, почему я не получаю вывод imagecreatefromjpeg в буфере?
буферы выход на стандартный поток. Сообщения об ошибках не выводятся на стандартный вывод, они выводятся на поток stderr. Поток stderr по умолчанию выводится в stdout, но после ob может что-то с этим сделать.
Вы можете явно подавлять ошибки с @
:
$img = @imagecreatefromjpeg($imgDestinationPath);
Тем не менее, это не совсем нормальная практика разработки — просто замалчивать ошибки.
Вы должны отключить отображение ошибок на производственных системах. На вашей платформе разработки увидеть все ошибки очень полезно, возможно, жизненно важно. При производстве через вас не нужно выводить какие-либо публичные сообщения об ошибках. Для этого вы установите display_errors
в вашем php.ini off
, Ваши ошибки все равно будут регистрироваться, но не будут выводиться на стандартный вывод.
Чтобы проверить последнюю произошедшую ошибку, используйте error_get_last
.
Вы можете использовать буфер сообщений об ошибках, чтобы получить последнюю ошибку. (увидеть http://php.net/manual/en/reserved.variables.phperrormsg.php )
$img = @imagecreatefromjpeg($imgDestinationPath);
if( $php_errormsg == "Corrupt JPEG data: premature end of data segment" )
{
$this->log("The following image is corrupted : $imgDestinationPath");
}
Как сказано в комментариях, @ не подавляет ошибку такого рода: «Поврежденные данные JPEG: преждевременный конец сегмента данных». Тем не менее, это работает для другой ошибки, как плохой файл, переданный в imagecreatefromjpeg.
Поэтому я создаю этот злой код для обнаружения ошибки перед использованием imagecreatefromjpeg.
$output = exec("jpeginfo -c $imgDestinationPath");
$size = filesize($imgDestinationPath);
if( strpos($output, (string)$size) !== false )
{
$error = "";
$arrayTemp = explode($size, $output);
$message = $arrayTemp[1];
if( strpos($message, "[OK]") === false )
{
$error = trim($message);
}
}