我正在尝试使用imagefromjpeg压缩上传的图像,但我收到此错误:
Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 24000 bytes)
图像只有13215317字节大 - 为什么我一直收到这个错误?我不能自己为服务器增加内存 - 所以有没有一种方法可以在不加载整个图像的情况下进行压缩?
$image = imagecreatefromjpeg('../../uploads/DSC_0230.jpg');
imagejpeg($image, '../../uploads/DSC_0230.jpg.new', 0.8);
imagedestroy($image);
答案 0 :(得分:1)
以这种方式将图像加载到PHP中将首先将JPEG解压缩为内存中的原始像素数据,然后生成新版本。因此,它将占用内存相当于图像分辨率的两个原始位图,以及PHP和脚本的其他开销。
由于您所做的只是使用不同选项重新压缩图像,因此使用专为该作业构建的工具(例如jpegtran
或jpegstrip
)或一般图像,您可能会获得更好的性能像ImageMagick这样的操纵工具。
然后,您可以使用shell_exec
从您的PHP脚本调用那些 - 非常小心,您已经验证了文件名,以便有人不能使用它来运行任意命令。
答案 1 :(得分:1)
问题:
1)增加PHP.ini文件中的内存限制,通常使用:
memory_limit = 128M
2)仅增加页面内存限制,仅为该页面执行编辑php.ini
:
ini_set('memory_limit','128M');
3)限制原始文件上传的大小。
有几种方法可以执行此操作,因此请{GS {3}}以及通过Google搜索找到的read the PHP manual重新发布。
4)您也可以尝试some useful posts。
从您的声明中,您无法使用ini_set
编辑PHP.ini,看起来您应该使用选项4和3.
此外,您当前的代码不正确。
imagejpeg($image, '../../uploads/DSC_0230.jpg.new', 0.8);
压缩值应为0到100之间的整数,以便将保存的JPEG正确设置为适当的压缩级别:
imagejpeg($image, '../../uploads/DSC_0230.jpg.new', 80);
这会将图片保存为80压缩值(您看起来像0.8
尝试的值)。