即使文件很小,php内存也会在文件上传时耗尽

时间:2014-09-11 18:42:58

标签: php memory upload

我有一个图片上传器,可以从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;
    }


}


?>

我应该尝试一下吗?可能导致这种情况的原因是什么?

2 个答案:

答案 0 :(得分:0)

你的函数有递归。在saveFile里面还有另一个saveFile。如果你在saveFile函数中注释掉saveFile调用,你会发现,你不会再耗尽内存了。

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

答案 1 :(得分:0)

修改php.ini文件就可以了。

memory_limit = 128M

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