2012-11-02 76 views
2

我想在選定時間後停止執行循環。意味着循環它會嘗試執行一個參數並花費很長時間,然後它會完成工作並轉到下一個參數。如:在選定時間後停止執行循環

for ($i=2 ; $i <= 100 ; $i++) 

這裏,假定它將循環3,4,5,6,7,8,9,10和11這將需要很長的時間來執行。所以我只是想停止它(即10秒)後採取下一個選項我的意思是12,13,14 ...等 所以,我該如何做到這一點。我建立了這個set_time_limit(10);,但它不在這裏工作。

+0

與http://stackoverflow.com/q/10587323/1689451相關 –

回答

1

這很複雜。你將不得不創建一個單獨的線程來處理,所以你的主線程可以檢查它是否運行時間過長。

這些線程在PHP中被稱爲'forks'。

您必須調查Process Control functions,尤其是[pcntl_fork][2]。然後,使用pcntl_sigtimedwait,您可以在給定的超時期間等待分叉進程。當pcntl_sigtimedwait返回時,您可以檢查其返回值以查看過程是否超時。

+0

是'PHP'單線程? – mansoor

+0

是的。 '線索'可能不是合適的術語。但是,正如我所展示的,有辦法分叉進程並與(等待)主進程並行運行分叉子進程。 – GolezTrol

+0

可能在這裏可以使用'OS叉'。 – mansoor

1

您可以使用microtime()來衡量已用時間。請注意,這隻會在迭代完成後中斷。

$start = microtime(true); 
$limit = 10; // Seconds 

for ($i=2 ; $i <= 100 ; $i++) { 
    if (microtime(true) - $start >= $limit) { 
    break; 
    } 
} 
+0

它會在迭代開始時檢查,但可能他想要一個解決方案來在迭代過程中打破循環。 – mansoor

+0

可能會打破我的整個腳本,如果我把它放在全球? @mansoor,你對。 –

+0

@mansoor這就是我所說的「請注意,這隻會在迭代完成後纔會中斷」。不能想出一個場景,這是*不*你想要的 – Znarkus