2010-06-04 75 views
2

例如我在加載時執行的頁面上有5個PHP函數。每個功能都有自己的處理時間,其中一些功能有時需要更多的時間才能完成任務。因此該頁面的總加載時間很慢。如何在PHP中控制腳本執行時間

我的問題是我如何控制每個腳本的執行時間並設置相同的時間限制。我知道在PHP中有一個內置函數,名爲set_time_limit();,但如果時間超出了最大限制,它會產生致命錯誤...

+0

如果時間超過最大值,您會希望看到什麼行爲?它應該記錄一條消息嗎?顯示錯誤? – phsource 2010-06-04 06:19:07

+1

不,我不想看到任何錯誤..剩下的腳本需要繼續並顯示結果。 – mathew 2010-06-04 06:23:21

+0

它是不是已經這樣做了?花些時間運行並最終顯示結果? – 2010-06-04 06:26:45

回答

1

從你的問題所說的話,我假設你有5個函數單個PHP文件(腳本),正在執行,並且如果其中一個執行時間過長,則應該跳過它。

您可以跳過功能的唯一方法是每隔一段時間輪詢一次。

function myFunction($someVar) { 
    $startTime = time(); 
    $timeLimit = 10; // Let's say, time limit is 10 seconds 
    while ($blah_blah == true) { // Some loop or code that takes a long time 
     // Do some work 
     if (time() - $startTime > $timeLimit) return; // Time's up! 
    } 
    // Done 
    return; 
} 

注意該函數將只在點返回,它檢查,如果時間到了,你必須手動的地方,你檢查,如果時間到了點。這個檢查確實有一些開銷,所以儘量不要放在任何地方。

如果我誤解了你的問題,請發表評論。

+0

是的,你在正確的軌道>>>謝謝 – mathew 2010-06-04 06:34:44

+0

你是什麼意思的開銷?是更密集的cpu? – mathew 2010-06-04 06:42:55

+0

@mathew當然,每個額外的操作都需要更多的CPU時間。如果您的循環每秒執行數千次,則時間比較代碼每秒也會執行數千次,每次貢獻幾分之一秒。 – deceze 2010-06-04 06:45:44

1

簡單的方法是撥打set_time_limit(0);,但只有在safe_mode關閉時纔有效。


我的這種方法是使用register_shutdown_function

function one() { 
    register_shutdown_function('two'); 
    /* do stuff */ 
} 

function two() { 
    register_shutdown_function('three'); 
    /* do stuff */ 
} 

function three() { 
    /* do stuff */ 
} 

one(); 

這似乎並不用PHP 5.3.1工作,我想這是因爲實施的更改在PHP 4.1.0中:

關閉功能現在稱爲 作爲請求的一部分。在早期的 版本的Apache下,已註冊的 關閉功能在 請求已完成後調用。

另一種可能是使用pcntl_fork,或者你可以問題的另一個請求(有file_get_contents例如),並調用所請求的腳本ignore_user_abort