今天我在我正在构建的内容管理系统中添加了一项新功能。根据您上传图像的位置,PHP将调整图像大小以适合指定的位置。它工作得很好,但是当我尝试上传更大的图像时,就像在3MB图像中一样,我收到致命的错误:
Fatal error: Allowed memory size of 134217728 bytes exhausted
(tried to allocate 42520 bytes) in...
我认为128MB的内存相当多,考虑到我没有跑那么多......至少我不这么认为。它试图为调整大小过程分配另外42520个字节,但是失败了。
我的问题是我应该(A)增加限制还是(B)重新评估为什么我首先使用这么多内存? 128MB是一个好数字还是太大/太少?
谢谢, 莱恩
解决
我得出结论,128MB对于调整图像大小实在太大了,我非常专注于查看其他选项...比如exec()选项,我从未仔细研究过我的“样本”数据。事实证明,即使我的大图像只有2.83MB,它的宽度也超过10000px。那是个问题。 :)
答案 0 :(得分:6)
GD将图像作为位图存储在内存中,因此我不会完全排除使用某些JPG图像(例如,高分辨率,高度压缩)的可能性,位图版本可能非常大。
在打开&之前立即致电memory_get_usage()开始调整图像大小&看看内存量是否太大了。
同样只是FYI,当脚本说“(试图分配42520字节)”时,这并不意味着它只需要42520多个字节才能成功运行。它只是意味着它需要42520多个字节。稍后它可能试图分配更多内存。因此,只需在内存总量中添加42520个字节就可能无法修复任何内容。
答案 1 :(得分:2)
你是如何调整图像大小的?我希望你像imagecopyresampled()
一样使用库函数吗?如果是这样,您不需要128M的RAM来调整3M图像的大小。它指的是你做错了事或做得不好。
答案 2 :(得分:0)
你不应该分配那么多的内存。重新评估您的代码以减少它的消耗并确保您不会多余地存储数据。
答案 3 :(得分:0)
对TrueColor图像消耗多少内存的粗略估计:
width x height x 4
如果您的用户被告知上传图片的最大尺寸(以像素为单位),那么您可以确定必须分配的最小内存。
BTW,考虑在格式转换,复制等操作中使用的变量
答案 4 :(得分:0)
使用64mb你可以使用很多东西。如果您需要更多,您需要一些能够开始清理已用内存的东西。 128Mb应该是脚本需要的最大值,而且确实必须是一个非常庞大的脚本。