【问题标题】:php memory exhausted on file upload even though file is small即使文件很小,文件上传也会耗尽php内存
【发布时间】:2014-09-11 18:42:58
【问题描述】:

我有一个图片上传器,可以从 HTML5 画布上传 base64 图像数据。

这适用于我尝试过的所有图像(超过 200 张),但记录时只有一张图像

PHP Fatal error:  Allowed memory size of 33554432 bytes exhausted (tried to allocate 8457492 bytes) in Unknown on line 0

这只发生在一张图片上(IMG_2613.jpg 1600x1200 图片/jpeg 6343099 字节)。 上传此图片时,帖子数据为:

file_name:img_2613.jpg
id:55488
size:large
image_data:data:image/jpeg;base64,/9j/4dy3RXhpZg....

错误还指出它尝试分配的内存少于允许的内存

<?php 


$root = $_SERVER['DOCUMENT_ROOT'];

$filteredData=substr($_POST['image_data'], strpos($_POST['image_data'], ",")+1);

$unencodedData=base64_decode($filteredData);

if ( !file_exists($root.'/_uploads/'.$_POST['id'].'/') ){
    mkdir($root.'/_uploads/'.$_POST['id'].'/', 0777, true);
}

if ( !file_exists($root.'/_uploads/'.$_POST['id'].'/'.$_POST['size'].'/') ){
    mkdir($root.'/_uploads/'.$_POST['id'].'/'.$_POST['size'].'/', 0777, true);
}

saveFile(0,$root,$unencodedData);



function saveFile($i,$root,$data){
    if ($i == 0){
        $rand = '';
    } else {
        $rand = $i.'_';
    }

    $saveLocation = '/_uploads/'.$_POST['id'].'/'.$_POST['size'].'/'.$rand.$_POST['file_name'];

    if ( file_exists($root.$saveLocation) ){
        saveFile($i+1,$root,$data);
    } else {
        file_put_contents($root.$saveLocation, $data );
        echo $saveLocation;
    }


}


?>

有什么我应该尝试的吗?这可能是什么原因造成的?

【问题讨论】:

    标签: php memory upload


    【解决方案1】:

    您的函数中有递归。在 saveFile 中还有另一个 saveFile。如果您在 saveFile 函数中注释掉 saveFile 调用,您会看到,您不会再出现内存耗尽的情况。

    您看,如果文件存在,那么您将尝试再次保存文件,这会再次调用循环。我相信你的逻辑有问题。

    【讨论】:

    • 试图把这条线注释掉,看看它是否有效。它仍然没有。此外,没有现有文件,如果未注释,则在这种情况下不会重复该功能。它的作用是,如果存在具有该名称的图像,它会将#_ 添加到图像名称中,例如“#_name.jpg”,其中 # 会随着工作需要而增加。此功能与我使用此脚本上传的所有其他图像完美配合。还有其他想法吗?
    • 您可以尝试回显文件名。并输入一个 if 语句: if($i > 20) exit;
    • 错误是“PHP 致命错误:允许的内存大小为 33554432 字节用尽(尝试分配 8457492 字节)在第 0 行的未知中”。它甚至没有通读文件 - 第 0 行。正如您所见,该文件也是未知的。当我对问题中显示的文件进行 ajax 调用时会发生错误,并且 chrome 在该 ajax 调用上返回 500 错误。
    • stackoverflow.com/questions/9076899/… 看看这个帖子。我建议您尝试逐行注释掉 1 行以找到导致问题的实际行。或者只是安装 XDEBUG 并设置一些断点。
    【解决方案2】:

    修改 php.ini 文件成功了。

    memory_limit = 128M
    

    我假设即使最大帖子大小与上传后的内存限制相同,它也比实际图像大小占用更多内存。它以 500 响应失败,因为它甚至在开始之前就耗尽了内存。这解释了第 0 行的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-08
      • 2016-03-29
      • 2018-09-18
      • 2022-08-04
      • 2017-06-23
      • 2016-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多