使用 PHP 上传图片并达到脚本内存限制
Posted
技术标签:
【中文标题】使用 PHP 上传图片并达到脚本内存限制【英文标题】:Uploading images with PHP and hitting the script memory limit 【发布时间】:2010-08-25 04:13:05 【问题描述】:我正在尝试使用 php 脚本上传 JPG 图片,但该图片不断导致我的脚本超时并出现此错误:
Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate
2136 bytes) in image.php on line 38
如果图片太大,我如何防止上传,或者让这个错误正常失败?
【问题讨论】:
【参考方案1】:实际问题不在于初始文件大小,而在于图像本身的尺寸(高度宽度颜色深度),因为在文件上传之前您无法访问此信息出于安全原因,您可能应该使用用 Flash、Java 或 Silverlight 编写的上传器,因为它们确实可以事先访问这些信息。
上传后,您可以通过使用getimagesize 并使用返回的宽度、高度和位深度计算(未压缩)图像的尺寸来检查图像是否会超出内存限制。
祝你好运。
【讨论】:
+1 正是我要写的。此外,请查看this question from yesterday【参考方案2】:http://php.net/manual/en/features.file-upload.common-pitfalls.php 说:
如果启用了内存限制,则可能需要更大的 memory_limit。确保将 memory_limit 设置得足够大。
【讨论】:
【参考方案3】:您可以通过多种方式限制图像大小或任何其他文件上传大小,
通过 php.ini,upload_max_filesize = 10M
通过诸如this(10k)之类的不可见标签:
<input type="hidden" name="MAX_FILE_SIZE" value="10000" />
如果您不知道它会对您的服务器配置产生什么样的影响,我不建议您增加内存限制。
【讨论】:
【参考方案4】:只需使用ini_set
为该特定脚本设置更高的内存限制。
在图像处理脚本的开头:
ini_set('memory_limit', '64M');
此错误通常不是由图像文件大小引起的,而是由图像分辨率引起的。因此,您可以对图像的大小进行一些检查。运行一些测试,看看在当前内存限制下什么是可接受的,如果分辨率更高,则终止进程并向用户返回错误。
【讨论】:
【参考方案5】:$size=filesize($_FILES['image']['tmp_name']);
会给你全局 $_FILES 数组中文件的大小。在此之后,只需将 $size 与您想要的最大大小进行比较。
查看文件大小() api:http://php.net/manual/en/function.filesize.php
【讨论】:
【参考方案6】:无论文件大小如何,所有上传尝试都会发生这种情况吗?我只在出现脚本错误时遇到过此类问题 - 通常是一个失控的循环。
【讨论】:
以上是关于使用 PHP 上传图片并达到脚本内存限制的主要内容,如果未能解决你的问题,请参考以下文章