Php Ajax请求内存不足
所以我在这个项目上工作,我必须建立一个照片共享网站,我选择照片,然后上传,通过电子邮件发送链接,然后这个人进入链接并下载照片。当我只有很少的照片时,当数据不超过100MB时,当我超过100MB时,一切都会变得不稳定 首先,我使用HTML5的Php Ajax请求内存不足,php,ajax,html,Php,Ajax,Html,所以我在这个项目上工作,我必须建立一个照片共享网站,我选择照片,然后上传,通过电子邮件发送链接,然后这个人进入链接并下载照片。当我只有很少的照片时,当数据不超过100MB时,当我超过100MB时,一切都会变得不稳定 首先,我使用HTML5的FileReader()。逻辑如下: 我使用FileReader()将每张照片转换为base64代码,每转换3张照片,我通过Ajax将一个3张照片长的base64字符串发送到php文件,该文件随后将代码转换为照片,并将其上传到服务器上的文件夹中 如果我选择了3
FileReader()
。逻辑如下:
我使用FileReader()
将每张照片转换为base64代码,每转换3张照片,我通过Ajax
将一个3张照片长的base64字符串发送到php
文件,该文件随后将代码转换为照片,并将其上传到服务器上的文件夹中
如果我选择了300张照片,我会执行100个ajax
请求。
第一个问题是,如果我的数据超过~150MB,则会出现ajax
内存不足的未捕获异常。
第二个问题是,如果我选择了超过20-30个文件,浏览器有时会没有响应,甚至崩溃
有什么建议我能做什么?也许整个想法都错了,我应该从别的地方开始,请帮忙
代码如下:
//Forming the inputs
$(document).on("change","#fileUp",function(e){
var file = null;
var files = e.target.files; //FileList object
var picReader = new FileReader();
$(".eventPop").html("");
$(".howMany").html("");
$(".eventPop").show();
$(".eventPop").append('<div class="adding"><img src="../public/cuts/uploading.gif" width="60px"></div>');
countUp = parseInt(countUp) + parseInt(files.length);
for(var i=0; i<=files.length-1; i++){
file = files[i];
var str = file.name.split(".")[0];
//
//var picReader = new FileReader();
if (file.type == "image/jpeg" || file.type == "image/png")
{
picReader.addEventListener("load",function(event){
count++;
var picFile = event.target;
$(".photos").append("<input type='hidden' id='ph"+count+"' get='"+picFile.result+"' /> ");
});
}
else
{
countUp--;
}
picReader.readAsDataURL(file);
}
});
//actual ajax requests
$(document).on('click','.uploadImages',function(){
info[1] = "4hold"+1 + Math.floor(Math.random() * 999999)+"_"+(new Date).getTime();
$.ajax({
type: "POST",
url: "index/loadIntoDB",
dataType:"text",
data: {info: info},
contentType: "application/x-www-form-urlencoded;charset=UTF-8",
success: function(result){
}
});
if (nrConfig > count)
{
nrConfig = count;
}
$(".eventPop").show();
$(".eventPop").html("");
$(".eventPop").append('<div class="adding"><p>Uploading files...'+( (nrConfig/count) * 100).toFixed(0)+'%</p></div>');
for(var i=1; i<=parseInt(nrConfig)+1; i++)
{
if (i == parseInt(nrConfig)+1)
{
info[2] = info[2].substring(2, info[2].length);
uploadImages(nrConfig,1);
}
else
{
//info[0] = i+"-"+info[0];
info[2] = info[2]+"--"+$("#ph"+i+"").attr("get");
}
}
});
function uploadImages(i,d){
info['3'] = i;
info['4'] = d;
$.ajax({
type: "POST",
url: "index/receiveImages",
dataType:"json",
data: {info : info },
beforeSend : function (){
//
},
contentType: "application/x-www-form-urlencoded;charset=UTF-8",
success: function(result){
for(index=result['leftOff']['1']; index <= result['info']['4']-1; index++)
{
if (result[index]['filesize'] < 1000000)
{
result[index]['filesize'] = Math.floor(result[index]['filesize']/1000)+"kb";
$("#ph"+result[index]['id']).append("<div class='filesize'>"+result[index]['filesize']+"</div>");
}
else
{
result[index]['filesize'] = (result[index]['filesize']/1000000).toFixed(2)+"MB";
$("#ph"+result[index]['id']).append("<div class='filesize'>"+result[index]['filesize']+"</div>");
}
if (result[index]['filesize'].length > 0)
{
$("#ph"+result[index]['id']+" .uploading").remove();
$("#ph"+result[index]['id']).append("<img src='layout/cuts/check.png' title='Uploaded' class='done'>");
$("#ph"+result[index]['id']+" .upd").remove();
}
}
$(".eventPop").html("");
$(".eventPop").append('<div class="adding"><p>Uploading files...'+( (result['info'][4]-1)/count * 100).toFixed(0)+'%</p></div>');
if (((result['info'][4]-1)/count * 100).toFixed(0) == 100)
{
setTimeout(function(){
$("progress").remove();
$(".eventPop").html("");
$(".eventPop").append("<div class='adding'>Upload complete!</div>");
setTimeout(function(){
$(".eventPop").html("");
$(".eventPop").append("<div class='adding'><div class='sendPhotos'><form action='#' onsubmit='return false;' method='post' enctype='multipart/form-data'><label>Your email</label><input type='text' class='yemail'/><br/><label>Friend's email</label><input type='text' class='fremail'/><br/><span class='tip'><div class='triangle'></div>You can send photos to multiple friends by typing their e-mail separated by ';'.<br/>Eg. 'thomas@gmail.com ; peter@gmail.com'</span><input type='submit' name='send' class='send' value='Send'></form></div></div>");
},1000);
},1000);
}
if (info[2].length)
{
info[2] = "";
}
if ( (parseInt(result['info']['4'])+parseInt(nrConfig)) >= count )
{
nrConfig = count-result['info']['4']+1;
}
if(result['info']['4'] <= count)
{
for(i=result['info']['4']; i <= parseInt(result['info']['4'])+parseInt(nrConfig); i++)
{
if (i == parseInt(result['info']['4'])+parseInt(nrConfig))
{
info[2] = info[2].substring(2, info[2].length);
uploadImages(nrConfig,result['info']['4']);
}
else
{
info[2] = info[2]+"--"+$("#ph"+i+"").attr("get");
}
}
}
}
});
}
//形成输入
$(文档)。关于(“更改”,“文件更新”,函数(e){
var file=null;
var files=e.target.files;//文件列表对象
var picReader=new FileReader();
$(“.eventPop”).html(“”);
$(“.howMany”).html(“”);
$(“.eventPop”).show();
$(“.eventPop”).append(“”);
countUp=parseInt(countUp)+parseInt(files.length);
对于(变量i=0;i计数)
{
nrConfig=计数;
}
$(“.eventPop”).show();
$(“.eventPop”).html(“”);
$(“.eventPop”).append(“上载文件…”+((nrConfig/count)*100).toFixed(0)+“%”);
对于(变量i=1;i 0)
{
$(“#ph”+结果[索引]['id']+.upload”).remove();
$(“#ph”+结果[索引]['id'])。追加(“”);
$(“#ph”+结果[索引]['id']+.upd”).remove();
}
}
$(“.eventPop”).html(“”);
$(“.eventPop”).append(“上载文件…”+((结果['info'][4]-1)/count*100).toFixed(0)+'%”);
if((结果['info'][4]-1)/count*100.toFixed(0)==100)
{
setTimeout(函数(){
$(“进度”).remove();
$(“.eventPop”).html(“”);
$(“.eventPop”).append(“上传完成!”);
setTimeout(函数(){
$(“.eventPop”).html(“”);
$(“.eventPop”).append(“您的电子邮件
朋友的电子邮件
您可以通过键入以“;”分隔的电子邮件向多个朋友发送照片。”thomas@gmail.com ; peter@gmail.com'");
},1000);
},1000);
}
如果(信息[2]。长度)
{
信息[2]=“”;
}
if((parseInt(result['info']['4'])+parseInt(nrConfig))>=count)
{
nrConfig=计数结果['info']['4']+1;
}
如果(结果['info']['4']1000000)
{
$size=number_格式($size/1000000),2.“MB”;
}
其他的
{
$size=number_格式($size/1000),0.“kb”;
}
返回filesize($file);
}
我在你的代码中看不到什么,但你必须问问自己:为什么3个图像的大小超过150MB?有些逻辑是错误的。不,我不是说3个图像的大小超过150MB,在我上传了100个总计达150MB的图像之后,我得到了内存不足的错误。这就像php或ajax占用了内存之类的,我不知道。嗯,您首先应该得到错误的确定方面,听起来像是客户端。希望这不是错误:。您应该将问题限制为:1.是文件选择对话问题。2.是AJAX问题。:)你能不能制作一个大于150MB的图像,然后看看一个这样大小的图像是否能覆盖它?我可以试一试,但如何制作一个大于150MB的图像?
public function receiveImages()
{
$string = strtok($_POST['info'][2],"--");
$currentID = $_POST['info']['4'];
$newArray['info']['3'] = $_POST['info']['3'];
$newArray['leftOff']['1'] = $currentID;
$phAdded = 0;
while($string != false && $phAdded < $_POST['info']['3'])
{
$newArray[$currentID]['id'] = $currentID;
$newArray[$currentID]['filesize'] = $this->saveImages($string,$_POST['info']['1'],$currentID);
$currentID++;
$phAdded++;
$string = strtok("--");
}
$newArray['info']['4'] = $currentID;
echo json_encode($newArray);
}
public function saveImages($base64img = "",$folder = "",$currentID = "")
{
$newArray = array();
if (!is_dir(UPLOAD_DIR.$folder))
{
mkdir(UPLOAD_DIR.$folder,0777);
}
$dir = UPLOAD_DIR.$folder."/";
if (strstr($base64img,'data:image/jpeg;base64,'))
{
$base64img = str_replace('data:image/jpeg;base64,', '', $base64img);
$uniqid = uniqid();
$file = $dir . $uniqid . '.jpg';
$file_name = $uniqid.".jpg";
}
else
{
$base64img = str_replace('data:image/png;base64,', '', $base64img);
$uniqid = uniqid();
$file = $dir . $uniqid . '.png';
$file_name = $uniqid.".png";
}
$data = base64_decode($base64img);
file_put_contents($file, $data);
$size = filesize($file);
if ($size > 1000000)
{
$size = number_format(($size/1000000),2)."MB";
}
else
{
$size = number_format(($size/1000),0)."kb";
}
return filesize($file);
}