2011-09-27 84 views
11

使用set_time_limit()的max_execution_time,沒有 「真正」 的限制(除了Windows)的執行時間,因爲PHP手冊中說:「真正」 的執行時間限制

注:

set_time_limit()函數和配置指令 max_execution_time隻影響腳本 本身的執行時間。在確定腳本運行的最長時間爲 時,不包括腳本執行 以外的任何活動時間,例如系統調用系統(),流操作, 數據庫查詢等。在測量時間是真實的Windows 上,這不是真的。

解決方案是proposed in PHP comments有一個「真正的」執行時間限制,就像我在找什麼,但我發現它不清楚/混淆。

+2

真正的執行時間限制是由執行進程的系統設置的。如果達到限制(也稱爲硬限制),它可以終止進程。這是一個真正的限制,通常基於CPU時間,即一個進程所消耗的實際時間(不是該進程已經運行了多長時間)。 – hakre

+5

[你正在談論的評論](http://www.php.net/manual/en/function.set-time-limit.php#105569)中提出的解決方案對我來說看起來不錯 - 只要你有POSIX和pcntl函數可用。你究竟對此瞭解甚麼? – DaveRandom

+0

仔細查看PHP手冊中的建議有幫助:)我最初並不明白它是如何工作的(我不習慣線程處理)。 –

回答

3

我可能是錯的,但據我瞭解,您要求解釋「PHP註釋」解決方案代碼。

訣竅是產生一個子進程,使用pcntl_fork函數,它會在某個超時後終止原始(父)進程。函數pcntl_fork返回父進程執行線程內新創建子進程的進程ID,子進程執行線程內返回0。這意味着父進程將執行下的代碼,如果語句和子進程將執行其他下的代碼。正如我們從代碼中可以看到的,父進程將執行無限循環,而子進程將等待5秒鐘,然後終止父進程。所以基本上你想要做這樣的事情:

$real_execution_time_limit = 60; // one minute 

if (pcntl_fork()) 
{ 
    // some long time code which should be 
    // terminated after $real_execution_time_limit seconds passed if it's not 
    // finished by that time 
} 
else 
{ 
    sleep($real_execution_time_limit); 
    posix_kill(posix_getppid(), SIGKILL); 
} 

我希望我已經把它搞好了。讓我知道你是否對此解決方案有疑問。