使用 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 上传图片并达到脚本内存限制的主要内容,如果未能解决你的问题,请参考以下文章

php 渲染大型 zip 文件 - 达到内存限制

PHP Drupal:更改限制上传内存

附加到大型 data.frame 并达到内存限制

响应式文件管理器上传内存限制,但仅限于图像

PHP修改脚本最大执行时间和最大内存限制

如何修改PHP的memory_limit限制