Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes)
仕事のために、いくつかのxlsおよびxlsxファイルをcsvに変換して再フォーマットする必要があります。私は怠け者で、実際には Excel のコピーを所有していないので、PHPExcel を使用して数行を書きました。PHPExcel はハード ドライブのディレクトリをループし、各ファイルを変換して別のディレクトリに保存します。
スクリプトはうまく機能し、時間を大幅に節約できますが、変換するファイルが 4 つ以上ある場合、メモリ エラーが発生します。
不要になったデータをメモリから消去する方法はありますか? 以下に示すように、一連の設定解除を試みましたが、役に立たなかったようです。
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
set_time_limit(0);
require_once 'PHPExcel.php';
require_once 'helper.php';
function swapExt($file, $ext){ return str_replace(substr($file,strpos($file,".")),".".$ext,$file);}
function makeCSV($table){$csv = ""; foreach($table as $r){$csv .= implode(",", $r).",\n";}return $csv;}
$filesDir = dirname(__FILE__)."\\files";
$iterator = new DirectoryIterator($filesDir);
foreach ($iterator as $fileinfo) {
if (!$fileinfo->isDot()) {
$xlsfile = $filesDir."\\".$fileinfo->getFilename();
$csv_filename = dirname(__FILE__)."\converted\\".basename(swapExt($xlsfile,"csv"));
$fd = fopen ($csv_filename, "w");
if (!file_exists($xlsfile)) {
exit($xlsfile.": File doesn't exist.\n");
}
$arrxls = excelToArray($xlsfile, true);
$rearr = array();
$cell_int = 0;
$row_int = 0;
foreach($arrxls as $row_arr){
foreach($row_arr as $k=>$v){
//add lastname to new array
if(strpos($k, "LASTNAME") !== false){
$rearr[$row_int][0] = $v;
}
//add firstname to array
if(strpos($k, "FIRSTNAME") !== false){
$rearr[$row_int][1] = $v;
}
// add mi to array
if(strpos($k, "MIDDLENAME") !== false){
if(strlen($v) > 1){
$rearr[$row_int][2] = substr($v,0,1);
}else{
$rearr[$row_int][2] = $v;
}
}
//add address line 1
if(strpos($k, "ADDRESSLINE1") !== false){
$rearr[$row_int][3] = $v;
}
//add address line 2
if(strpos($k, "ADDRESSLINE2") !== false){
$rearr[$row_int][4] = $v;
}
//add city
if(strpos($k, "CITY") !== false){
$rearr[$row_int][5] = $v;
}
//state
if(strpos($k, "STATE") !== false){
$rearr[$row_int][6] = $v;
}
//zip
if(strpos($k, "ZIPCODE") !== false){
if(strlen($v) > 5){
//if it's longer than 5 chars, set first 5
$rearr[$row_int][7] = substr($v,0,5);
$rearr[$row_int][8] = substr($v,-4);
}else{
$rearr[$row_int][7] = $v;
}
}
$cell_int++;
}
if(!isset($rearr[$row_int][0])){$rearr[$row_int][0] = "";}
if(!isset($rearr[$row_int][1])){$rearr[$row_int][1] = "";}
if(!isset($rearr[$row_int][2])){$rearr[$row_int][2] = "";}
if(!isset($rearr[$row_int][3])){$rearr[$row_int][3] = "";}
if(!isset($rearr[$row_int][4])){$rearr[$row_int][4] = "";}
if(!isset($rearr[$row_int][5])){$rearr[$row_int][5] = "";}
if(!isset($rearr[$row_int][6])){$rearr[$row_int][6] = "";}
if(!isset($rearr[$row_int][7])){$rearr[$row_int][7] = "";}
if(!isset($rearr[$row_int][8])){$rearr[$row_int][8] = "";}
if(!isset($rearr[$row_int][9])){$rearr[$row_int][9] = "";}
if(!isset($rearr[$row_int][10])){$rearr[$row_int][10] = "";}
if(!isset($rearr[$row_int][11])){$rearr[$row_int][11] = "";}
if(!isset($rearr[$row_int][12])){$rearr[$row_int][12] = "";}
$row_int++;
}
$fileContent = makeCSV($rearr);
if(fputs($fd, $fileContent)){echo $xlsfile." converted.<br />";}
fclose($fd);
unset($fd); unset($fileContent); unset($rearr); unset($arrxls);
}
}