文件上载时php内存耗尽,即使文件很小

文件上载时php内存耗尽,即使文件很小,php,memory,upload,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字节)。 上载此图

我有一个图像上传器,可以从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字节)。 上载此图像时,post数据为:

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;
    }


}


?>


有什么我应该试试的吗?是什么导致了这种情况?

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


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

修改php.ini文件就成功了

memory_limit = 128M

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

试图注释掉该行,看看它是否有效。现在还没有。此外,没有现有的文件,如果未注释,该函数在本例中不会重复。它所做的是,如果存在具有该名称的图像,它会在图像名称中添加#u,如“#name.jpg”,其中#会根据需要增加多少。此函数与我使用此脚本上传的所有其他图像完美配合。还有其他想法吗?你可以试着重复文件名。并输入一个if语句:if($i>20)退出;错误为“PHP致命错误:第0行上未知的33554432字节的允许内存大小已用尽(尝试分配8457492字节)”。它甚至不读取文件行0。正如您所看到的,该文件也是未知的。错误发生在我对问题中显示的文件进行ajax调用时,chrome在该ajax调用中返回500个错误。看这根线。我建议你试着逐行注释,找出导致问题的实际行。或者只是安装XDEBUG并设置一些断点。