Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes)
对于工作,我必须将几个xls和xlsx文件转换并重新格式化为csv。由于我很懒,并且实际上没有Excel的副本,我使用PHPExcel写了几行,它循环遍历我的硬盘上的目录,转换每个文件并将其保存到另一个目录。
该脚本运行良好,节省了大量时间,但如果要转换的文件超过4个,则会出现内存错误。
有没有办法在不再需要内存后清除内存中的数据?正如你在下面看到的,我尝试了一堆unsets,但它似乎没有帮助。
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);
}
}