2017-05-30 40 views
-2

我想讀一個大的製表符分隔文件有30K行。然後,我要拆分線,但我得到一個max_execution_timeout即使max_execution_time 90它超時...PHP讀取30K線文件

線條沒有太多的內容,我認爲應該有30k行?你有好主意嗎?

$handle = fopen($_FILES["myfile"]["tmp_name"], "r"); 
while (!feof($handle)) { 
    $line = fgets($handle); 

    $parts = preg_split('/\s+/', $line); 
    $line_id = $parts[0]; 
    echo $line_id; 
} 
+2

你知道,如果它的工作原理呢?你有沒有檢查錯誤信息,嘗試用更小的文件等? – pvg

+0

它的製表符分隔 - 但你在_any_空白拆呢?做到這一點_right_ - 使用'fgetcsv' – CBroe

+0

您的文件是CSV類型? –

回答

0

您應該檢查兩件事情,max_execution_time和PHP memory_limit。此外,您可以嘗試按塊讀取文件。

memory_limit的:設置在一個腳本允許分配字節的存儲器的最大量。這有助於防止編寫糟糕的腳本來消耗服務器上的所有可用內存。請注意,如果沒有內存限制,請將此指令設置爲-1。

max_execution_time這設置腳本在解析器終止前允許運行的最長時間(以秒爲單位)。這有助於防止編寫糟糕的腳本捆綁服務器。默認設置爲30。當在命令行運行PHP的默認設置爲0

試試這個辦法,在這裏,你是不讀的內存中的整個文件。運行所需的最大內存取決於輸入中最長的行。

$handle = fopen("/tmp/uploadfile.txt", "r") or die("Couldn't get handle"); 

ini_set('max_execution_time', 300); 
ini_set('memory_limit','512M'); 

if ($handle) { 
    while (!feof($handle)) { 
     $buffer = fgets($handle, 4096); 
     // your data processing here 
    } 
    fclose($handle); 
}