【问题标题】:PHP memory_limit and $_FILES sizePHP memory_limit 和 $_FILES 大小
【发布时间】:2016-07-31 02:01:24
【问题描述】:

当我尝试上传文件时,我会像这样检查文件大小:

if($_FILES['attachment_file']['size'] > (1024 * 1024 * 20)) // 20 MB
{
echo 'The file is too big !'; exit();
}

在我的 htaccess 文件中,我有:

php_value memory_limit 21M
php_value max_execution_time 300
php_value upload_max_filesize 21M
php_value post_max_size 21M

所以,我使用 php 检查文件是否超过 20 MB,然后停止脚本。但是错误“文件太大!”没有显示...

在 php 错误日志中,我收到错误“允许的内存大小为 22020096 字节已用尽”。

如果我将 (1024 * 1024 * 20) 更改为 (1024 * 1024 * 10),它会按预期工作。 php 捕获错误并向我显示消息:“文件太大!”。

问题出在哪里?为什么不能使用 20 MB?

PS:我检查了phpinfo,看看htaccess的配置是否被占用,没关系。

【问题讨论】:

  • 您是在本地还是在服务器上?也许您不允许将 memory_limit 设置为 >20M?
  • 是的,我在 localhsot 上,但我已经说过 phpinfo 说来自 htaccess 的配置被采用。所以我被允许....
  • 听起来可能比发布的 sn-p 更多。我有两个问题:是什么导致内存不足错误以及您正在测试的文件有多大?另外,它是否适用于非常小的文件?
  • 该文件有 16 Mb 并且来自日志的错误是:: PHP 致命错误:C:\wamp\www\require\ADMIN_files 中允许的内存大小为 134217728 字节已用尽(试图分配 66000 字节)第 110 行的 .php PHP 堆栈跟踪:PHP 1. {main}() C:\wamp\www\index.php:0 PHP 2. require_once() C:\wamp\www\index.php:3 PHP 3. require_once() C:\wamp\www\require\REQ_require.php:39 PHP 4.imagecreatefromjpeg() C:\wamp\www\require\ADMIN_files.php:110
  • Oooo... 该文件只有 16Mb.... 那么这意味着 php 条件没问题。那为什么 imagecreatefromjpeg 返回这个错误? memory_limit 是 128 百万...

标签: php .htaccess config memory-limit


【解决方案1】:

如果您使用imagecreatefromjpeg(),我怀疑它需要分配足够的内存来存储来自源图像的原始像素数据。也就是说,加载 10x10 的图像将需要 10*10*3 = 300 字节或更多的存储空间,仅用于像素数据。鉴于 JPEG 大小,我怀疑您的图像非常大。该像素数据的大小加上任何 PHP 开销可能会超出您的内存限制,尤其是在您进行读取和保存之外的任何操作时。

【讨论】:

    【解决方案2】:

    尝试将 .htaccess 中的内存限制增加到 21MB 以上,以允许应用程序运行时内存,或者在 PHP 中使用它:

    ini_set('memory_limit', '128M');
    

    【讨论】:

    • memory_limit 增加到 128M。错误“文件太大!”仍然没有显示:(服务器似乎停止并且错误日志是:“允许的内存大小为 134217728 字节已用尽”。确实,我要上传的文件非常大,但 php 不应该向我显示错误“文件太大”?我不明白...
    • 你的文件大小可能没问题,只是你执行的代码达到了内存限制。检查是否有任何可以进行的优化或可能永远运行的循环。如果你在内存中操作一个大文件,那么 PHP 进程可以轻松使用 128M 内存。
    【解决方案3】:

    您需要确保正确设置以下所有变量:

    upload_max_filesize - max size of any individual file in an upload
    max_file_uploads - total number of files allowed to be uploaded
    post_max_size - sum total of all data being POSTed (form data + files)
    memory_limit - must be > post_max_size, to allow space for PHP + script overhead
    

    @ref:Upload doesn't work right when the file is too big

    摆脱这种情况

    if($_FILES['attachment_file']['size'] > (1024 * 1024 * 20)) // 20 MB
    {
    echo 'The file is too big !'; exit();
    }
    

    【讨论】:

      猜你喜欢
      • 2013-08-08
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      • 2016-10-27
      • 1970-01-01
      • 2011-05-20
      相关资源
      最近更新 更多