循环或递归PHP函数延时 - 需要事件循环?分叉?

时间:2015-09-03 19:06:32

标签: php mysql multiprocessing daemon pcntl

我有一个需要在某些事件发生后约10秒执行的PHP函数。

函数可以依次创建一个新的事件实例,需要在10秒后再次触发该函数。

通常,该函数不会创建新事件,但长度可达~1000的链可能。 (10,000秒)因此 - 我认为在一个单独的睡眠循环php进程中包含整个链是不合理的。 (这是不正确的吗?)

在任何给定时间,这些事件 - 功能链最多可以有100个单独的实例同时运行。

我一直在用exec()和其他潜在的解决方案对reactphp / system_daemon / pcntl / fake-forking进行大量研究。想知道这类问题的最佳解决方案是什么。

我还需要一些方法来捕捉断链或超时长进程,尝试在10秒窗口内重启它们。

非常感谢。

3 个答案:

答案 0 :(得分:2)

我会调查Gearman。它是一个基于队列的系统。您有工作线程执行实际处理,客户端将信息传递给工作人员。这样,您可以同时获取所有10个网页。这可能对您有所帮助,因为您可以对其进行编程以运行5次迭代然后重新启动(以防止内存泄漏或挂起)。

我在Ubuntu和CentOS服务器上使用它取得了巨大成功。无论您是在进行邮件队列还是连接到一次只需要一次调用的API,这对于完成这些任务非常有用。

编辑:您还可以运行从PHP客户端启动的Java,Python或其他编程语言。非常适合将各种编程语言连接在一起如果您害怕内存泄漏,我会尝试用另一种语言进行处理。但我不知道你的最终任务是什么,所以我不能提供更多的帮助。

答案 1 :(得分:1)

10秒很长一段时间,所以我将它存储在MySQL的队列中,其中包含最早的执行时间和事件的信息,可能是序列化形式。这意味着大约有10秒,也许还有11秒,甚至12秒并不意味着灾难。

该表看起来很像

create table stored_events (start_at datetime, event text);

你读了一个1秒的队列

select * from stored_events where start_at <= now();

你写了

insert into stored_event set start_at = now() + interval 10 second, event='<event>'";

答案 2 :(得分:0)

您是否考虑过使用cron作业和数据库来控制php的实例?每10秒钟,一个cron作业可以运行,检查创建N个instatiations的必要性,并用curl或fork实例化它们。