2012-11-02 29 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