4

有没有办法定期执行一个函数?

我有一个数据库表,我需要知道何时添加或删除条目。我尝试使用的逻辑是 Ajax 调用服务器,但不是立即响应,而是服务器连续检查 30 秒是否更新数据库,如果是,则只有它响应,否则它会在 30 秒后响应。这样,我试图通过每秒调用 Ajax 请求来最小化服务器上​​的负载。

我该怎么做呢?使用while循环有意义吗?这样的事情可能是——

while (SomeCondition)
{
   if (CheckIfDatabaseChanged())
   {
      echo "System Updated";
      break;
   }
}

如果这是一个没有意义的解决方案,那么我如何确保循环仅运行 30 秒并中断。还是有更好的解决方案?

4

2 回答 2

7

您正在考虑的是一种称为长轮询的东西,它在 PHP 上的扩展性不好,尤其是在您使用阻塞 IO 时。

有关更多信息,请参阅https://stackoverflow.com/a/6488569/11926 。

但是您的代码可能看起来像这样

set_timeout_limit(31);
$i=0;
while ($i<30) {
    // poll database for changes which is a bad idea.
    i = i + 1;
    sleep(1); // sleep 1 second
}

我敢打赌你不能同时运行许多这些。我的建议是使用类似redis pubsub的东西来通知数据库更改和某种长轮询/websocket 解决方案。

如果可能,您应该subscribe为数据库更改生成一个后台进程,然后将更改发布到pusher,例如,因为拥有多个长时间运行的进程确实对性能不利。

您可以自己托管它们,也可以使用托管服务,例如:

雷迪斯:

长轮询/Websocket:

他们都有小型免费计划,可以帮助您入门,当您对这些计划变得太大时,您可以考虑自己托管这些解决方案。


PS :我还在 PHP 中找到了一个名为React的非阻塞解决方案。此解决方案可能会在 PHP 中扩展(更好)。

于 2012-06-22T10:03:14.347 回答
0

用这个:

set_timeout_limit(0)

http://se.php.net/manual/ru/function.set-time-limit.php

于 2012-06-22T09:42:50.877 回答