在PHP中是否有相应的设定时间?

时间:2011-06-26 19:58:37

标签: php javascript

PHP是否等同于在JavaScript中设置超时?

在JavaScript中,您可以使用设置的超时功能在经过一定时间后执行代码。

是否可以在PHP中执行此操作?

4 个答案:

答案 0 :(得分:4)

PHP是单线程的,通常PHP专注于HTTP请求周期,因此在请求完成后,允许超时运行代码是很棘手的。

我建议你研究Gearman作为将工作委托给其他PHP进程的解决方案。

答案 1 :(得分:2)

这很难看,但基本上有效:

<?php
declare(ticks=1);

function setInterval($callback, $ms, $max = 0)
{
  $last = microtime(true);
  $seconds = $ms / 1000;

  register_tick_function(function() use (&$last, $callback, $seconds, $max)
  {
    static $busy = false;
    static $n = 0;

    if ($busy) return;

    $busy = true;

    $now = microtime(true);
    while ($now - $last > $seconds)
    {
      if ($max && $n == $max) break;
      ++$n;

      $last += $seconds;
      $callback();
    }

    $busy = false;
  });
}

function setTimeout($callback, $ms)
{
  setInterval($callback, $ms, 1);
}

// user code:

setInterval(function() {
  echo microtime(true), "\n";
}, 100); // every 10th of a second

while (true) usleep(1);

只有在可勾选的PHP语句之后才会调用间隔回调函数。因此,如果您尝试每秒调用一次函数10次,但是调用sleep(10),则在睡眠结束后,您将批量执行100次滴答功能。

请注意,setInterval还有一个附加参数,用于限制调用它的次数。 setTimeout只需拨打setInterval即可获得一个限制。

如果unregister_tick_function在过期后被调用会更好,但我不确定除非有一个监控和取消注册它们的主刻度函数,否则这是否可行。

我没有尝试实现类似的东西,因为这是如何设计PHP。可能有更好的方法来做任何你想做的事情。

答案 2 :(得分:1)

您可以使用sleep()功能:

int sleep ( int $seconds )

// Delays the program execution for the given number of seconds. 

示例:

public function sleep(){
   sleep(1);
   return 'slept for 1 second';
}

答案 3 :(得分:0)

在不知道问题的用例的情况下,很难回答它:

  • 如果您想稍后向客户端发送其他数据,可以在客户端使用处理程序执行JS超时,该处理程序将向PHP发出新的HTTP请求。
  • 如果您想稍后安排某项任务,可以将其存储在数据库中并以常规的间隔轮询数据库。它不是最好的解决方案,但相对容易实现。