2016-07-14 73 views
-1

我有一個PHP文件執行時間的問題,首先我告訴我在PHP文件中做了什麼..我需要生成CSV文件,所以我編寫了查詢從數據庫中獲取數據。和我的查詢返回100萬條記錄,我已經使用PHP fwrite()將數據寫入CSV文件。但我的腳本採取76.481406211853秒來生成一個csv文件ehich包含100萬的數據。如何減少這種執行時間?有時我得到致命錯誤:如何減少PHP執行時間以及如何在PHP中設置ini_set()?

Fatal error: Allowed memory size of 1048576 bytes exhausted (tried to allocate 793601 bytes)

那麼,如何管理內存?

PHP代碼在這裏:

<?php 
// start script 
$time_start = microtime(true); 
echo_memory_usage(); 

//My logic here 

// End of Script 
echo 'Total execution time in seconds: ' . (microtime(true) - $time_start); 
echo_memory_usage(); 

function echo_memory_usage() { 
    $mem_usage = memory_get_usage(true); 

    if ($mem_usage < 1024) 
     echo $mem_usage." bytes"; 
    elseif ($mem_usage < 1048576) 
     echo round($mem_usage/1024,2)." kilobytes"; 
    else 
     echo round($mem_usage/1048576,2)." megabytes"; 

    echo "<br/>"; 
} 
?> 

我的結果是

512 kilobytes //Script start 
1006.25 megabytes // script End 
Total execution time in seconds: 76.481406211853 

而且成功寫入CSV 100萬個記錄文件..但執行時間過長,有時會引發致命錯誤。還有如何設置ini_set()?因爲我必須設置ini_set('memory_limit', '1023M');

我之所以設置1023,腳本運行後內存使用率是1006.25,所以我必須設置1023M?這是正確的方式嗎?

+0

爲了澄清,並10個LAKS意味着百萬? – Steve

+0

你顯示的代碼並不顯示你在做什麼,它只是顯示'//我的邏輯在這裏'。解決這個問題的最佳方法是查詢數據庫,然後一次遍歷結果集1行並將條目寫入文件,但是沒有看到任何相關的代碼,很難建議如何改進它 –

+0

此外,維基百科,這裏的大多數人不會知道什麼是lak - 建議使用英語向更廣泛的受衆描述您的問題 –

回答

0

通常你會通過你的網絡服務器的php.ini中做到這一點,但你也可以做這樣的:

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

值也像16,32,64總是與「M」結尾規定爲兆字節。

或者只是刪除了極限:

ini_set("memory_limit",-1); 
+0

到OP - 請注意,刪除限制通常是一個壞主意,尤其是如果該腳本已經在使用1GB的內存 - 這表示編碼/邏輯不正確,您應該重點解決這個問題,而不是讓您的腳本擁有無限的資源 –

1

執行時間依賴於外部連接,數據庫連接和相同的腳本的循環。試着每一步一個腳印做: 1.讓腳本只是連接到數據庫無所事事 2.讓腳本讀取數據 3.讓腳本編寫數據保存

寫下的執行時間每個案例來檢查故障的位置。

1

選項1: 您可以在您的php.ini文件中更改memory_limit

選項2: 也許您正在使用重物或慢速連接。 如果你想提高你的代碼,你可以在這裏進行測試:

// Code 1 
$start = microtime(true); 

/* Here the code 1 */ 

$timeTotal1 = microtime(true) - $start; 
echo 'Code 1: '. $timeTotal1 .'<br>'; 


// Code 2 
$start = microtime(true); 

/* Here the code 2 */ 

$timeTotal2 = microtime(true) - $start; 
echo 'Code 2: '. $timeTotal2 .'<br>'; 

// Winner 
echo '<b>Winner:</b> '. ($timeTotal1 > $timeTotal2 ? 'Code 2' : 'Code 1');