2012-05-09 41 views
2

我正在測試一個php腳本來創建包含大量數據的csv文件。 這是我做這個任務的方式:我有通知處理大尺寸字符串時PHP腳本停止工作

$csvdata = "ID,FN,LN,ADDR,TEL,PRO\n 
      1,fn1,ln1,addr1,tel1,pro1\n...etc,"; 
$fname = "./temp/filename.csv"; 
$fp = fopen($fname,'w'); 
fwrite($fp,$csvdata); 
fclose($fp); 

,當字符串($ csvdata)包含像100,000個數據行腳本做工精細。但是,當它獲得更多的10,00,000數據行時,它停止在構建字符串$ csvdata(我通過連接for循環中的數據,來自數據庫的數據構建$ csvdata字符串)的中間。

當我們使用大字符串值時,有人能告訴我發生了什麼問題嗎?

謝謝 親切的問候

+1

「停止」,如「掛起」?或「崩潰」?或「出錯」? – deceze

回答

5

我通過在串聯數據環路建設$ csvdata字符串,數據從數據庫中。

從這我收集,你正在準備整個文件寫成一個字符串,並最終寫入文件。

如果是這樣,那麼這種方法並不好。請記住,字符串存在於主內存中,每次追加時,都會消耗更多的內存。解決這個問題的方法是逐行寫入文件,從數據庫讀取記錄,如果需要則轉換/格式,準備CSV行並將其寫入文件。

+0

非常感謝codaddict!將嘗試該方法。 :) –

+0

我同意該解決方案。也取決於每行的寫入數據的實現,將確保你不會丟失數據...在其他情況下,如果你正在等待完整的字符串建立有機會,你可能會失去數據... – swapnilsarwe

+0

@YasiruGaminda你可以使用[file_put_contents](http://php.net/manual/fr/function.file-put-contents.php)在 – swapnilsarwe

1

看看你的錯誤日誌。它可能會說一些關於

  1. 你試圖分配內存超過一些最大值。這意味着你使用的內存太多 - >你可以改變php允許使用的內存數量(內存限制在php.ini中)

  2. 執行時間比允許的時間長。再一次,你可以增加這個時間。

1

它應該是在$csvdata=部分進入你的腳本可能給出一個Memory Exhausted錯誤。

當您將10個字符保存到您的變量中時,它需要10位,並且它不斷變大。限制是當它到達分配的內存或PHP。

因此,這是你如何繼續前行:

  1. 套裝內存限制 - 增加你的PHP內存限制

'的ini_set( 'memory_limit的', '256M');由線

寫各數據到文件

2.Write線rightaway代替堆放起來。另外,如果將數組[0]寫入文件,然後將下一條數據存儲到數組[1]並再次寫入並繼續執行此操作,則它與您現在的操作效果相同。

因此,無論

while(blah blah){ 
$var = "text"; 
fwrite($file,$var); 

或在for循環

for($i=0;blahblah){ 
$var[$i] = "query"; 
fwrite($file,$var[$i]); 
unset($var); 

For循環就派上用場了,當數據庫查詢與WHERE id='$i'

好運條件句。