每秒调用一次PHP函数

时间:2012-06-22 09:39:52

标签: php

有没有办法定期执行某个功能?

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

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

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

如果这是一个没有无意义的解决方案,那么我怎样才能确保循环只运行30秒并且中断。或者有更好的解决方案吗?

2 个答案:

答案 0 :(得分: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之类的东西来通知db更改和某种长轮询/ websocket解决方案。

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

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

<强> Redis的:

长轮询/ Websocket:

他们都有一些小的免费计划可以让你开始,当你为这些计划变得太大时,你可以考虑为自己托管这些解决方案。


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

答案 1 :(得分:0)