Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何避免PHP/WordPress在大文件上传中批量处理数据时出现致命错误?_Php_Wordpress_Batch Processing_Bulk Load - Fatal编程技术网

如何避免PHP/WordPress在大文件上传中批量处理数据时出现致命错误?

如何避免PHP/WordPress在大文件上传中批量处理数据时出现致命错误?,php,wordpress,batch-processing,bulk-load,Php,Wordpress,Batch Processing,Bulk Load,我有一个大的CSV文件,我正在上传到WordPress仪表板,用于导入分类术语。我编写了一个小插件,它使用wp\u insert\u term()函数插入每个术语,但是,该函数缓存了大量数据,以检查slug的唯一性和父术语的依赖性。尽管将内存分配增加到0.5 Gb,但该过程大约会耗尽1000个术语的内存 我一直希望将文件分割成可管理的块,以便批处理数据并运行限制为1000行或1000行数据的会话,这样每个进程都可以干净地终止 我一直在寻找这样的解决方案,并发现这是一个有趣的关于批量图像导入面临的

我有一个大的CSV文件,我正在上传到WordPress仪表板,用于导入分类术语。我编写了一个小插件,它使用
wp\u insert\u term()
函数插入每个术语,但是,该函数缓存了大量数据,以检查slug的唯一性和父术语的依赖性。尽管将内存分配增加到0.5 Gb,但该过程大约会耗尽1000个术语的内存

我一直希望将文件分割成可管理的块,以便批处理数据并运行限制为1000行或1000行数据的会话,这样每个进程都可以干净地终止

我一直在寻找这样的解决方案,并发现这是一个有趣的关于批量图像导入面临的类似问题,它概述了开发人员如何使用javascript通过向服务器发送ajax请求和可管理的块来控制批处理过程

它让我想到,逐行阅读,然后向服务器发送一个ajax请求,以处理可管理的行数


有没有更好的方法来实现这一点

我根据问题中的链接和一些额外的修补开发了以下解决方案

在WordPress服务器端,加载javascript文件时,我根据内存分配确定服务器可以处理的行数

$limit = ini_get('memory_limit');
$limit = wp_convert_hr_to_bytes($limit) / MB_IN_BYTES; //in MBs.
switch(true){
    case $limit >= 512:
        $limit = 1000;
        break;
    default:
        $limit = 500;
        break;
}
wp_enqueue_script( 'my-javascript-file');
wp_localize_script( 'my-javascript-file', 'cirData', array(
    'limit'=>$limit
));
您应该根据您的流程确定并设置自己的限制

在javascript文件中,使用jQuery

var reader,formData, lineMarker=0, csvLines, isEOF=false, $file, $form ;
  $(document).ready(function(){
    $file = $(':file'); //file input field
    $form = $('form');  //form
    //when the file field changes....
    $file.on('change', function(){
      //check if the file field has a value.
      if($file.val()){
        //setup file reader.
        reader = new FileReader();
        //now listen for when the file is ready to be read.
        reader.addEventListener('load', function (e) {
          csvLines = e.target.result.split("\n");
          batchProcess(); //launch process.
        });
        //when the form is being submitted, start reading the file.
        $(document).on('click', ':submit', function(e){
          e.preventDefault(); //disable normal submit.
          //setup data for the ajax.
          formData = new FormData($form.get(0));

          //read the file and batch request to server.
          reader.readAsBinaryString($file.get(0).files[0]);
        })
      }
    })
  });

  // Methods
  //posting
  function postCSVdata(csvdata){
    formData.set('csvlines', csvdata); //set the current datat to send.
    $.ajax({
      type: 'POST',
      url: $form.attr('action'),
      data: formData,
      contentType: false,
      processData: false,
      cache: false,
      success: function(data){
        var msg ="";
        if(isEOF){ //is this end of the file?
          console.log("success!");
        }else{ //continue reading file.
          console.log("uploaded:"+ Math.round(lineMarker/csvLines.length*100)+"%");
          batchProcess(); //process the next part of the file.
        }
      }
    })
  }
  //batch process.
  function batchProcess(){
    //csvlines is the array containing all the lines read from the file.
    //lineMarker is the index of the last line read.
    var parsedata='', stop = csvLines.length - lineMarker, line='';

    for(var i = 0; i < stop; i++) {
      line = csvLines[i+lineMarker];
      parsedata +=line+"\n"; //add a new line char for server to process.
      //check if max limit of lines server can process is reached.
      if(i>(cirData.limit-2)) break; //batch limit.
    }
    lineMarker += i;
    if(i==stop) isEOF = true;
    postCSVdata(parsedata); //send to server.
  }
var读取器,formData,lineMarker=0,csvLines,isEOF=false,$file,$form;
$(文档).ready(函数(){
$file=$(':file');//文件输入字段
$form=$('form');//form
//当文件字段更改时。。。。
$file.on('change',function(){
//检查文件字段是否有值。
如果($file.val()){
//安装文件读取器。
reader=newfilereader();
//现在,请侦听文件准备好读取的时间。
reader.addEventListener('load',函数(e){
csvLines=e.target.result.split(“\n”);
batchProcess();//启动进程。
});
//提交表单时,开始读取文件。
$(文档)。在('单击',':提交')上,函数(e){
e、 preventDefault();//禁用正常提交。
//为ajax设置数据。
formData=newformdata($form.get(0));
//将文件和批处理请求读取到服务器。
reader.readAsBinaryString($file.get(0.files[0]);
})
}
})
});
//方法
//张贴
函数数据(csvdata){
formData.set('csvlines',csvdata);//设置要发送的当前数据。
$.ajax({
键入:“POST”,
url:$form.attr('action'),
数据:formData,
contentType:false,
processData:false,
cache:false,
成功:功能(数据){
var msg=“”;
如果(isEOF){//文件的这一端是吗?
console.log(“成功!”);
}否则{//继续读取文件。
console.log(“上传:”+Math.round(lineMarker/csvLines.length*100)+“%”;
batchProcess();//处理文件的下一部分。
}
}
})
}
//批处理。
函数batchProcess(){
//csvlines是包含从文件中读取的所有行的数组。
//lineMarker是最后读取的行的索引。
var parsedata='',stop=csvLines.length-lineMarker,line='';
对于(变量i=0;i(cirData.limit-2))中断;//批量限制。
}
lineMarker+=i;
如果(i==停止)isEOF=true;
PostSvData(parsedata);//发送到服务器。
}

这会以连续的方式发送多个AJAX请求,服务器可以在不出现致命内存错误的情况下处理这些请求。

我基于问题中的链接和一些额外的修补开发了以下解决方案

在WordPress服务器端,加载javascript文件时,我根据内存分配确定服务器可以处理的行数

$limit = ini_get('memory_limit');
$limit = wp_convert_hr_to_bytes($limit) / MB_IN_BYTES; //in MBs.
switch(true){
    case $limit >= 512:
        $limit = 1000;
        break;
    default:
        $limit = 500;
        break;
}
wp_enqueue_script( 'my-javascript-file');
wp_localize_script( 'my-javascript-file', 'cirData', array(
    'limit'=>$limit
));
您应该根据您的流程确定并设置自己的限制

在javascript文件中,使用jQuery

var reader,formData, lineMarker=0, csvLines, isEOF=false, $file, $form ;
  $(document).ready(function(){
    $file = $(':file'); //file input field
    $form = $('form');  //form
    //when the file field changes....
    $file.on('change', function(){
      //check if the file field has a value.
      if($file.val()){
        //setup file reader.
        reader = new FileReader();
        //now listen for when the file is ready to be read.
        reader.addEventListener('load', function (e) {
          csvLines = e.target.result.split("\n");
          batchProcess(); //launch process.
        });
        //when the form is being submitted, start reading the file.
        $(document).on('click', ':submit', function(e){
          e.preventDefault(); //disable normal submit.
          //setup data for the ajax.
          formData = new FormData($form.get(0));

          //read the file and batch request to server.
          reader.readAsBinaryString($file.get(0).files[0]);
        })
      }
    })
  });

  // Methods
  //posting
  function postCSVdata(csvdata){
    formData.set('csvlines', csvdata); //set the current datat to send.
    $.ajax({
      type: 'POST',
      url: $form.attr('action'),
      data: formData,
      contentType: false,
      processData: false,
      cache: false,
      success: function(data){
        var msg ="";
        if(isEOF){ //is this end of the file?
          console.log("success!");
        }else{ //continue reading file.
          console.log("uploaded:"+ Math.round(lineMarker/csvLines.length*100)+"%");
          batchProcess(); //process the next part of the file.
        }
      }
    })
  }
  //batch process.
  function batchProcess(){
    //csvlines is the array containing all the lines read from the file.
    //lineMarker is the index of the last line read.
    var parsedata='', stop = csvLines.length - lineMarker, line='';

    for(var i = 0; i < stop; i++) {
      line = csvLines[i+lineMarker];
      parsedata +=line+"\n"; //add a new line char for server to process.
      //check if max limit of lines server can process is reached.
      if(i>(cirData.limit-2)) break; //batch limit.
    }
    lineMarker += i;
    if(i==stop) isEOF = true;
    postCSVdata(parsedata); //send to server.
  }
var读取器,formData,lineMarker=0,csvLines,isEOF=false,$file,$form;
$(文档).ready(函数(){
$file=$(':file');//文件输入字段
$form=$('form');//form
//当文件字段更改时。。。。
$file.on('change',function(){
//检查文件字段是否有值。
如果($file.val()){
//安装文件读取器。
reader=newfilereader();
//现在,请侦听文件准备好读取的时间。
reader.addEventListener('load',函数(e){
csvLines=e.target.result.split(“\n”);
batchProcess();//启动进程。
});
//提交表单时,开始读取文件。
$(文档)。在('单击',':提交')上,函数(e){
e、 preventDefault();//禁用正常提交。
//为ajax设置数据。
formData=newformdata($form.get(0));
//将文件和批处理请求读取到服务器。
reader.readAsBinaryString($file.get(0.files[0]);
})
}
})
});
//方法
//张贴
函数数据(csvdata){
formData.set('csvlines',csvdata);//设置要发送的当前数据。
$.ajax({
键入:“POST”,
url:$form.attr('action'),
数据:formData,
contentType:false,
processData:false,
cache:false,
成功:功能(数据){
var msg=“”;
如果(isEOF){//文件的这一端是吗?
console.log(“成功!”);
}否则{//继续读取文件。
console.log(“上传:”+Math.round(lineMarker/csvLines.length*100)+“%”;
batchProcess();//处理