imagecreatefrompng(和imagecreatefromstring)导致不可恢复的致命错误

SeR*_*gIO 5 php php-gd php-7

当我尝试在不正确的png图像上使用php-gd函数时,出现致命PHP错误。这似乎是一种错误,因为相应于功能文档(imagecreatefrompng例如,):

* @return resource an image resource identifier on success, false on errors.

但是,当我尝试使用不正确的图像进行操作时,我有:

Fatal error: imagecreatefrompng(): gd-png: fatal libpng error: Read Error: truncated data in /var/www/common/models/Utils.php on line 61

导致此错误的代码很简单:

$handle = imagecreatefrompng($fname);
Run Code Online (Sandbox Code Playgroud)

在此字符串之后没有代码执行。

imagecreatefromstring尝试从相同的字符串创建图像时,具有相同的行为。

我无法“修复”此图片,因为它是用户提供的,因此我需要处理这种情况。

我试图使用try...catch像这样的块:

echo 'start'."\n";
try {
    imagecreatefromstring($result);
} catch (\Throwable $e) {
    echo 'error'."\n";
    return null;
}
echo 'success'."\n";
Run Code Online (Sandbox Code Playgroud)

但是脚本仅输出“开始”,然后消失并显示我上面已发布的错误描述。

Ubuntu 16.04.2,PHP 7.0,php7.0-gd扩展都是最新版本。

所以我无法使用try ... catch块来处理它,我也不知道该如何处理或修复它。有任何想法吗?

UPD:这似乎与环境真的很奇怪,因为当我在Windows(使用PHP 7.0)下运行相同的代码时,会产生正确的“警告”错误。

UPD2:似乎是新的错误https://bugs.php.net/bug.php?id=73986

Jul*_*enV 5

聚会有点晚了,但我也遇到了这个问题,并且迫不及待地将错误修复包含在我的 ubuntu LTS 中 我发现的唯一干净的解决方法实际上是使用 Imagick::valid() 检查图像是否有效的。

function imageIsValid($path)
{
    try
    {
        $imagick = new \Imagick($path);

        return $imagick->valid();
    }
    catch (\Exception $e)
    {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,您的服务器/主机需要安装 php imagick 扩展...