我有一个图片上传器,可以从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;
}
}
?>
我应该尝试一下吗?可能导致这种情况的原因是什么?
答案 0 :(得分:0)
你的函数有递归。在saveFile里面还有另一个saveFile。如果你在saveFile函数中注释掉saveFile调用,你会发现,你不会再耗尽内存了。
你看,如果文件存在,那么你会再次尝试保存文件,它会再次调用循环。我相信你的逻辑有错。
答案 1 :(得分:0)
修改php.ini文件就可以了。
memory_limit = 128M
我认为即使最大帖子大小与内存限制相同,一旦上传,它会占用比实际图像大小更多的内存。它失败了500响应,因为它甚至在开始之前耗尽了内存。这解释了第0行的错误。