由于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数据:数据段的过早结束 string(4)“test”
图片损坏:
关于为什么我没有在缓冲区中输出imagecreatefromjpeg的任何想法?
答案 0 :(得分:1)
在stdout流上缓冲输出。错误消息不在stdout上输出,它们在stderr流上输出。默认情况下,stderr流然后输出到stdout,但ob之后可以对它做任何事情。
您可以使用@
明确禁止错误:
$img = @imagecreatefromjpeg($imgDestinationPath);
然而,简单地消除错误并不是一种理智的开发实践。
您应该关闭生产系统上的错误显示 。在您的开发平台上,查看所有错误非常有用,可以说是至关重要的。在生产过程中,您不希望任何公共错误输出。为此,您将php.ini中的display_errors
设置为off
。您的错误仍会被记录,但不会输出到stdout。
要检查上次发生的错误,请使用error_get_last
。
答案 1 :(得分: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");
}
答案 2 :(得分: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);
}
}