【发布时间】:2010-06-25 02:32:57
【问题描述】:
我正在开发一个需要延迟 PHP 事件的在线 PHP 应用程序。基本上,我需要能够在最初访问 URL 后的多秒(但可能是几天)内执行任意 PHP 代码。我需要相当精确地执行这些 PHP 事件,而且我希望它具有相当的可扩展性。我试图避免需要安排一个 cron 作业每秒运行一次。我正在研究Gearman,但它似乎没有提供任何安排事件的能力,据我所知,PHP 并不是真的要作为守护进程运行。
如果我可以告诉一些外部进程在下一个事件应该运行的确切时间轮询 PHP 服务器上的“事件检查器”url,那将是理想的。这个轮询时间需要能够随意减少或增加,因为可以删除事件并将其添加到队列中。有什么想法可以优雅地完成此任务吗? 在外部调用 PHP(必须解析 HTTP 请求或通过 CLI 调用)来使这个想法对我的需求可行。
我目前的计划是编写一个 PHP 守护程序,它将运行事件并使用 gearman 从 PHP 服务器与它交互。 PHP 守护程序将围绕SplMinHeap 构建,因此希望性能不会太差。这个想法在我的嘴里留下了不好的味道,我想知道是否有人有更好的想法?想法略有改变。阅读编辑 2。
编辑:
我正在创建一个在线游戏,让玩家在不同的时间限制下轮流进化。我正在使用 XMPP 和 BOSH 来允许我将消息推送到我的客户或从我的客户那里推送消息,但是我已经完成了这部分工作。现在我正在尝试添加一个在客户端播放后触发的任意事件,以让客户端(以及游戏中的其他人)花费很长时间。我不能在客户端使用定时触发器,因为这可以被利用(因为客户端可以自己玩)。希望对您有所帮助。
编辑 2:
感谢大家的反馈。尽管我认为您的大多数想法在小规模上都可以很好地发挥作用,但我感觉它们的扩展性不会很好(外部事件管理器)或缺乏该项目所需的准确性(CRON)。此外,在这两种情况下,它们都是外部部件,可能会出现故障并增加已经很复杂的系统的复杂性。
我个人觉得唯一clean的解决方案满足这个项目的要求就是写一个PHP daemon来处理延迟事件。我已经开始编写我认为是first PHP runloop。它处理监视套接字和执行延迟的 PHP 事件。希望当我接近完成这个项目时,我可以发布源代码,如果你们中的任何人对此感兴趣的话。到目前为止,在测试中它已被证明是一种很有前途的解决方案(没有内存泄漏或不稳定的问题)。
编辑 3: 这里有一个指向名为LooPHP 的 PHP 事件循环库的链接,供感兴趣的人使用。
TL;DR 要求
- 延迟调用(最好是本地)PHP(从几秒到几天)
- 任意处理事件的创建/更新/删除(我预计会取消大量调用)。
- 处理调度的高负载事件(每台服务器每秒 100-1000 次)
- 通话时间应在预定时间的一秒内
- 目前我不打算将代码库重写为另一种语言(也许有一天我会这样做)
【问题讨论】:
-
你在做什么需要这么精确的时间?如果您更了解为什么您正在做您正在做的事情,我们可能会想到其他方法。
-
P.S:我也在考虑用java编写一些东西你想要什么?我认为你可以用java高效/快速地编写它。如果你可以使用java,也许你可以使用它?
-
@Alfred 它必须触发一个 PHP 事件,所以如果它是运行本机代码的 PHP 守护进程或调用 PHP 服务器上的 URL 的 Java 守护进程,它会起作用。我已经构建了一个 PHP 守护程序,它将通过 gearman 与主要的 PHP 命中进行交互。它允许我为一个键设置一个“事件”,并在任何时候通过同一个键更新那个“事件”。这对我的需求非常有用,因为每场比赛一次只有 1 个事件。 gist.github.com/452525
-
嗨 Kendall 我想我在 java 中创建了一些你可以使用的东西:)。我为此感到非常自豪。在几个小时内编码(加上基本文档)。我认为文档仍然有点落后,但我假设您已经足够聪明,可以理解它。请参阅下面我修改后的帖子以获取更多信息。希望你喜欢。
-
很好的问题,虽然我认为应该编辑标题。与其说是关于 PHP 的“事件”,不如说是关于延迟/延迟处理。
标签: php events asynchronous daemon