问题描述
|
我已经对此进行了一些搜索,并且我知道不可能从耗尽的内存致命错误中恢复。我有一个运行imagecreatefromjpeg的脚本。我尝试捕获异常,尝试使用@运行函数,然后检查返回值是否为null或false,尝试使用\'die()\'运行它。没用。因此,我无法从中“恢复”。
那么在我开始之前有可能预料到它吗?是否可以检查jpeg的未压缩大小然后优雅地死掉?我想通过以下方式向用户发送消息:“图像$ image太大,无法处理。您将需要手动创建缩略图\”。
我的共享主机不允许我将内存大小增加到64mb以上,因此这不是一个选择。我的代码如下...
function createthumb($section,$filename,$constrain=100)
{
$dir = \"$section/thumbs_$constrain\";
if(file_exists($workingdir.\"$section/thumbs_$constrain/$filename\")) return 1;
if(!file_exists($dir)) mkdir($dir);
$src = imagecreatefromjpeg($workingdir.\"$section/$filename\");
...
解决方法
根据经验,您可以使用getimagesize()返回的像素大小:
list ($width,$height) = getimagesize($file);
$memory = $width * $height * 4; // 4 bytes per pixel
如果此数字大于预定义的限制(要根据经验确定,则以32 * 1024 * 1024之类的数字开头),则不要用imagecreatefromjpeg()
加载它。
,您是否考虑过使用ImageMagic代替GD? ImageMagic能够在加载期间调整jpeg的大小,因此它不会消耗大量的PHP内存。有关详细信息,请参见此StackOverflow答案。
,我认为只有错误处理程序才能为您提供帮助,因为异常处理可能无法在内存耗尽时起作用
http://php.net/manual/zh/function.set-error-handler.php
,您可以在imagegreatefromjpeg之前验证字符串源的大小。