0

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);

    }
}
4

0 に答える 0