Php Ajax请求内存不足

Php Ajax请求内存不足,php,ajax,html,Php,Ajax,Html,所以我在这个项目上工作,我必须建立一个照片共享网站,我选择照片,然后上传,通过电子邮件发送链接,然后这个人进入链接并下载照片。当我只有很少的照片时,当数据不超过100MB时,当我超过100MB时,一切都会变得不稳定 首先,我使用HTML5的FileReader()。逻辑如下: 我使用FileReader()将每张照片转换为base64代码,每转换3张照片,我通过Ajax将一个3张照片长的base64字符串发送到php文件,该文件随后将代码转换为照片,并将其上传到服务器上的文件夹中 如果我选择了3

所以我在这个项目上工作,我必须建立一个照片共享网站,我选择照片,然后上传,通过电子邮件发送链接,然后这个人进入链接并下载照片。当我只有很少的照片时,当数据不超过100MB时,当我超过100MB时,一切都会变得不稳定

首先,我使用HTML5的
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);


    }