2014-06-09 35 views
0

我正在使用fputcsv(顯然)在應用程序中創建表的csv文件。我簡單地發佈數據的2D陣列到:fputcsv不適用於大型陣列

function formatoutput(&$vals, $key){ 
    foreach($vals AS $row=>&$cell){ 
     $cell = str_replace('"', '""', $cell); 
     $cell = str_replace(array("\n",','), '', $cell); 
    } 
} 

function outputCSV($array) { 
    $outstream = fopen("php://output", "w"); 
    function __outputCSV(&$vals, $key, $filehandler) { 
     fputcsv($filehandler, $vals); 
    } 
    array_walk($array, "formatoutput"); 
    array_walk($array, "__outputCSV", $outstream); 
    fclose($outstream); 
} 

outputCSV(unserialize($_POST['data'])); 

所以,對於在陣列中的每一行,它其追加到csv文件。那麼,這工作正常,直到我通過一個數組約500或更多的行。

使用此功能時是否有尺寸限制?文檔沒有提及任何內容。或者是否有PHP設置會限制大小?

有這個問題在這裏:is there a file size limit when creating a csv file using php and mysql?

這基本上問的是同樣的事情,但即使有明顯的答案,它並沒有真正解釋任何可能的解決方案。它只是聲明:

「聽起來像是您的環境設置的問題 - 不是代碼或技術的限制。」

+0

什麼是您的php.ini設置?特別是memory_limit呢? – kojiro

+2

你不需要做任何'formatoutput'的東西。 fputcsv已經爲你做到了。基本上你是對你的輸出進行雙重編碼。一次通過你的函數,一次通過fputcsv。 –

+0

很可能你的問題是你的函數的copy-on-change;你通過值傳遞你的數組到outputCSV,但在你的數組中改變它走....所以這是倍增內存使用.... fputcsv()沒有任何內存限制,但你的代碼重複做 –

回答

1

PHP將這些變量加載到內存中。根據你的php.ini設置,每個腳本都有最大的內存容量。

此外,當變量被複制時,它們可佔用內存空間的兩倍。源內存和目標內存。我不確定fputcsv的內部結構,但是可能整個數組在內部轉換爲csv「對象」,然後寫入文件。

所以,請記住,您可能在您複製任何時間時將內存使用量翻番。

最起碼,請在你的php.ini中檢查你的「memory_limit」。如果您需要特別增加一個腳本,那麼您可以在腳本中將其設置爲:

ini_set('memory_limit','16M');