2015-01-07 1 views
2

Я пытаюсь поймать следующую ошибку из-за функции imagecreatefromjpeg.ob_start не работает с некоторыми функциями

данных Коррумпированные 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) "тест"

Поврежденные изображения:

Corrupted image

y идеи относительно того, почему я не получаю imagecreatefromjpeg вывода в буфере?

+0

Вместо 'ob_start()' попытаться использовать 'попробовать {// Пробуем свои вещи здесь} поймать (Exception $ е) {эхо "делать свои вещи, чтобы поймать его здесь"}' блок! Это делает трюк для вас? – Rizier123

+0

'imagecreatefromjpeg' возвращает' false', если он встречает какие-либо ошибки. Если мне не хватает чего-то, смотрящего, что выходной буфер здесь не нужен.Не могли бы вы просто сделать 'if (! $ Output) {$ this-> log (" ... "); } 'вместо? – alexpls

+1

Также есть хороший пример того, как поймать ошибки при использовании 'imagecreatefromjpeg' на сайте документации PHP здесь: http://php.net/manual/en/function.imagecreatefromjpeg.php – alexpls

ответ

0

Чтобы получить последнюю ошибку, вы можете использовать буфер errormessage. (См 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"); 
} 
+0

Я пытался подавить ошибку с @, но для этой конкретной ошибки это не работает! Однако, если файл не существует, @ подавляет ошибку. – Buddy

1

О.Б. буферы выходные на поток STDOUT. Сообщения об ошибках не выводятся на stdout, они выводятся в потоке stderr. Поток stderr по умолчанию выводится на stdout, но после того, как ob может что-то сделать с этим.

  1. Вы можете явно подавить ошибки с @:

    $img = @imagecreatefromjpeg($imgDestinationPath); 
    

    Однако, это не совсем вменяемый практика развития просто молчание ошибок.

  2. Вы должны отключить отображение ошибок на производственных системах. На вашей платформе разработки все ошибки очень полезны, возможно, жизненно важны. При производстве вы не хотите, чтобы какая-либо публичная ошибка выводилась вообще. Для этого вы установите display_errors в свой php.ini до off. Ваши ошибки будут по-прежнему регистрироваться, но не будут выводиться на stdout.

  3. Чтобы проверить последнюю произошедшую ошибку, используйте error_get_last.

+0

Я пытался подавить ошибку с @, но для этой конкретной ошибки это не работает! Однако, если файл не существует, @ подавляет ошибку. – Buddy

+0

Хм, интересно. У меня нет времени, чтобы создать тестовую среду, чтобы воспроизвести это на данный момент. По-видимому, эта ошибка запускается где-то на нижнем уровне в библиотеке gd, а затем обходит регулярную обработку ошибок PHP; Я не уверен, что такая вещь действительно возможна или как ее предотвратить. – deceze

0

Как сказано в комментариях, «@» не подавляет такую ​​ошибку: «Коррумпированные данные JPEG: преждевременный конец сегмента данных». Тем не менее, это работа для других ошибок, таких как bad file, переданных 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); 
    } 
}