>有没有办法定期执行函数?
我有一个数据库表,我需要知道何时添加或删除条目。我尝试使用的逻辑是 Ajax 调用服务器,但服务器不是立即响应,而是连续检查 30 秒,如果数据库已更新,如果是,则只有响应,否则它会在 30 秒后响应。这样,我试图通过每秒调用 Ajax 请求来最小化服务器上的负载。
我该怎么做?使用while
循环有意义吗?像这样的事情可能是——
while (SomeCondition)
{
if (CheckIfDatabaseChanged())
{
echo "System Updated";
break;
}
}
如果这是一个没有意义的解决方案,那么我如何确保循环仅运行 30 秒并中断。还是有更好的解决方案?
你正在考虑的是所谓的长轮询,它在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
例如,因为具有多个长时间运行的进程确实对性能不利。
您可以自己托管它们或使用托管服务,例如:
雷迪斯:
- http://redistogo.com
长轮询/网络套接字:
- http://pusher.com
他们都有小型免费计划,可以帮助您入门,当您对这些计划来说太大时,您可以考虑为自己托管这些解决方案。
PS:我还在PHP中找到了一个非阻塞解决方案,称为React。这个解决方案可能会在 PHP 中扩展(更好)。
使用这个:
set_timeout_limit(0)
http://se.php.net/manual/ru/function.set-time-limit.php