【问题标题】:stop executing loop after a selected time在选定的时间后停止执行循环
【发布时间】:2012-11-02 12:41:33
【问题描述】:

我想在选定的时间后停止执行循环。意味着循环时它将尝试执行一个参数并花费很长时间,然后它将完成工作并转到下一个参数。如:

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

在这里,假设它会循环 3,4,5,6,7,8,9,10 并且在 11 中需要很长时间才能执行。所以我只想在(即10秒)之后停止它并采取下一个选项,我的意思是12、13、14 ...等。 那么,我该怎么做。我设置了这个 set_time_limit(10); ,但它在这里不起作用。

【问题讨论】:

标签: php loops


【解决方案1】:

您可以使用microtime() 来测量经过的时间。请注意,这只会在迭代完成后中断。

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

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

【讨论】:

  • 它将在迭代开始时检查,但可能他想要一个解决方案来在迭代期间打破循环。
  • 如果我把它放在全局范围内,它可能会破坏我的整个脚本吗? @mansoor,没错。
  • @mansoor 这就是我所说的“请注意,这只会在迭代完成后中断”。无法想出这不是你想要的场景
【解决方案2】:

这很复杂。您必须创建一个单独的线程来进行处理,以便您的主线程可以检查它是否已经运行了太长时间。

这些线程在 PHP 中称为“分叉”。

您必须调查Process Control functions,尤其是[pcntl_fork][2]。然后,使用pcntl_sigtimedwait,您可以在给定的超时期间等待分叉的进程。当pcntl_sigtimedwait返回时,可以查看它的返回值,看看进程是否超时。

【讨论】:

  • 是的。 “线程”可能不是正确的术语。但是,正如我所展示的,有一些方法可以分叉进程并与(等待的)主进程并行运行分叉的子进程。
  • 这里可能OS forks可以用。
  • 是的,这就是那些 PHP 函数在后台使用的。
猜你喜欢
  • 1970-01-01
  • 2018-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-20
  • 1970-01-01
  • 2016-07-02
  • 2012-10-28
相关资源
最近更新 更多