2015-01-07 15 views
2

imagecreatefromjpeg 기능으로 인해 다음 오류를 잡으려고합니다.일부 기능에서는 ob_start가 작동하지 않습니다.

손상된 JPEG 데이터 : 내가위한 ob_start 사용하려고하고 ob_get_contents하지만이 작동하지 않도록 내 PHP 스크립트의 출력이 오류를 표시하지 않는 데이터 세그먼트

의 조기 종료. 목표는이 오류를 포착하여 손상된 이미지를 파악하는 것입니다.

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

Any ide 내가 버퍼에서 imagecreatefromjpeg 출력을 얻지 못하는 이유는 무엇입니까?

+0

대신에 '시도 {// 여기에 당신의 것을 시도하십시오} catch (Exception $ e) {echo "당신의 물건을 여기 잡으십시오.}}'block! 그게 당신을 속이는가? – Rizier123

+0

'imagecreatefromjpeg'는 오류가 발생하면'false'를 반환합니다. 내가 출력 버퍼를보고 뭔가를 놓치지 않는 한 여기에 불필요한 것 같습니다.단순히 if (! $ output) {$ this-> log ("..."); }'대신에? – alexpls

+1

PHP 문서 사이트에서'imagecreatefromjpeg'를 사용하는 중에 오류를 잡는 방법에 대한 좋은 예가 있습니다 : 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

OB 버퍼 표준 출력 스트림에 대한 출력 . 오류 메시지는 stdout에 출력되지 않고 stderr 스트림에 출력됩니다. stderr 스트림은 기본적으로 stdout으로 출력되지만 ob은 그것에 대해 아무 것도 할 수 없습니다.

  1. 명시 적으로 @와 오류를 억제 할 수

    $img = @imagecreatefromjpeg($imgDestinationPath); 
    

    그러나, 정말 단순히 오류를 침묵 제정신이 개발 관행이 아니다.

  2. 생산 시스템에서 오류 디스플레이 을 해제해야합니다. 개발 플랫폼에서 모든 오류를 보는 것은 매우 중요하며 틀림없이 중요합니다. 생산 과정에서 공개 오류 출력이 전혀 필요하지 않습니다. 이를 위해 php.ini에서 display_errorsoff으로 설정했습니다. 오류는 계속 기록되지만 표준 출력에는 출력되지 않습니다.

  3. 마지막으로 발생한 오류를 검사하려면 error_get_last을 사용하십시오.

+0

@ 함께 오류를 억제하려고했지만이 특정 오류 때문에 작동하지 않습니다! 그러나 전달 된 파일이 없으면 @ 오류가 표시되지 않습니다. – Buddy

+0

흠, 흥미 롭습니다. 지금은 그 순간을 재현 할 테스트 환경을 설정할 시간이 없습니다. 분명히 그 오류는 gd 라이브러리의 어딘가에서 트리거되어 PHP의 일반적인 오류 처리를 우회합니다. 나는 그런 일이 실제로 가능하다는 것을 확신하지 못합니다. – deceze

0

'@'는 '@ 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); 
    } 
}