当我尝试在不正确的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
聚会有点晚了,但我也遇到了这个问题,并且迫不及待地将错误修复包含在我的 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 扩展...