ob_start不适用于某些功能

时间:2015-01-07 10:44:31

标签: php gd ob-start

由于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”

图片损坏:

Corrupted image

关于为什么我没有在缓冲区中输出imagecreatefromjpeg的任何想法?

3 个答案:

答案 0 :(得分:1)

在stdout流上缓冲输出。错误消息不在stdout上输出,它们在stderr流上输出。默认情况下,stderr流然后输出到stdout,但ob之后可以对它做任何事情。

  1. 您可以使用@明确禁止错误:

    $img = @imagecreatefromjpeg($imgDestinationPath);
    

    然而,简单地消除错误并不是一种理智的开发实践。

  2. 您应该关闭生产系统上的错误显示 。在您的开发平台上,查看所有错误非常有用,可以说是至关重要的。在生产过程中,您不希望任何公共错误输出。为此,您将php.ini中的display_errors设置为off。您的错误仍会被记录,但不会输出到stdout。

  3. 要检查上次发生的错误,请使用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);
   }
}