【问题标题】:ob_start doesn't work with some functionsob_start 不适用于某些功能
【发布时间】:2015-01-07 10:44:31
【问题描述】:

由于 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 输出的任何想法?

【问题讨论】:

  • 尝试使用try { //Try your stuff here } catch(Exception $e) { echo "do your stuff to catch it here" } 块而不是ob_start()!这对你有用吗?
  • imagecreatefromjpeg 在遇到任何错误时返回false。除非我错过了看输出缓冲区的东西,否则这里似乎没有必要。你不能简单地改用if (!$output) { $this->log("..."); }吗?
  • 还有一个很好的例子,说明如何在 PHP 文档站点上使用 imagecreatefromjpeg 时捕获错误:php.net/manual/en/function.imagecreatefromjpeg.php
  • 这是我的第一次尝试,但也没有成功。
  • 不幸的是,在我的情况下 imagecreatefromjpeg 不会返回 false。 var_dump(imagecreatefromjpeg($img)) 返回: (gd) 类型的资源(537)。看来这只是一个警告。

标签: php gd ob-start


【解决方案1】:

ob 在标准输出流上缓冲 输出。错误消息不会在 stdout 上输出,而是在 stderr 流上输出。默认情况下,stderr 流会输出到 stdout,但在 ob 之后可以对其执行任何操作。

  1. 您可以使用@ 显式抑制错误:

    $img = @imagecreatefromjpeg($imgDestinationPath);
    

    但是,简单地消除错误并不是一个明智的开发实践。

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

  3. 要检查最后发生的错误,请使用error_get_last

【讨论】:

  • 我试图用@ 来抑制错误,但是对于这个特定的错误它不起作用!但是,如果传递的文件不存在@抑制错误。
  • 嗯,很有趣。我现在真的没有时间建立一个测试环境来重现它。显然,该错误是在 gd 库中的某个较低级别触发的,然后绕过了 PHP 的常规错误处理;我不确定这样的事情实际上是否可能或如何防止它。
【解决方案2】:

您可以使用错误消息缓冲区来获取最后一个错误。 (见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");
}

【讨论】:

  • 我试图用@ 来抑制错误,但是对于这个特定的错误它不起作用!但是,如果传递的文件不存在@抑制错误。
【解决方案3】:

正如 cmets '@' 中所说,不会抑制这种错误:“损坏的 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);
   }
}

【讨论】:

    猜你喜欢
    • 2014-10-12
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多