PHP中是否有与设置超时等效的功能?

10

在 PHP 中有没有与 JavaScript 中设置超时的等价功能?

在 JavaScript 中,可以使用setTimeout函数在一定时间后执行代码。

在 PHP 中是否也可以实现类似功能呢?


3
为什么?浏览器希望尽快看到PHP的结果。可以提供更详细的信息吗? - mplungjan
1
参见sleep()(http://php.net/sleep),但正如@mplungjan所说:为什么!? - Matt
脚本通常只有30秒左右的执行时间,之后服务器就会强制终止它。 - Richard
@Richard 这取决于 php.ini 的设置。这也是一个可调整的限制。如果您愿意,您可以永远运行单个 PHP 脚本。 - PiZzL3
1
@PiZzL3,PHP和JavaScript对我来说听起来像是基于浏览器的东西,而不是cron表,除非它被错误地标记了。因此,如果不是基于浏览器的话,你当然是正确的。 - mplungjan
显示剩余3条评论
5个回答

6

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

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


5
你可以使用 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';
}

除了长轮询,你为什么要这样做呢? - Karoly Horvath

3
这个看起来不太美观,但基本上能够工作:
<?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次tick函数。
请注意,setInterval有一个额外的参数来限制它被调用的次数。setTimeout只调用一次setInterval
最好在过期后调用unregister_tick_function,但我不确定除非有一个主tick函数来监视和注销它们,否则是否可能实现这一点。
我没有尝试实现任何类似的东西,因为这不是PHP设计的使用方式。很可能有更好的方法来做你想做的事情。

0

如果不知道您的问题用例,很难回答:

  • 如果您想稍后向客户端发送其他数据,则可以在客户端上使用JS超时,并使用处理程序对PHP进行新的HTTP请求。
  • 如果您想安排一些任务以供以后使用,则可以将其存储在数据库中,并定期轮询DB。这不是最佳性能解决方案,但相对容易实现。

0

如果 ($currenturl != $urlto) exit( wp_redirect( $urlto ) );

您可以将上面的两行代码替换为以下代码,放入您的函数中:

如果 ($currenturl != $urlto)
header( "refresh:10;url=$urlto" );


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接