【问题标题】:Scalable, Delayed PHP Processing可扩展的延迟 PHP 处理
【发布时间】: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


【解决方案1】:

使用命令“at”让您的 php 脚本执行 exec 调用以安排您的 PHP 脚本在您需要的时间运行

exec("at 22:56 /usr/bin/php myscript.php");

at 在指定时间执行命令。

来自手册页:

At 允许相当复杂的时间规范,扩展了 POSIX.2 标准。它接受 HH:MM 形式的时间以 spe 运行作业 一天中的具体时间。 (如果那个时间已经过去,那么第二天就是 假定。)您还可以指定午夜、中午或下午茶时间(下午 4 点)和 您可以有一个以 AM 或 PM 为后缀的时间,以便在 早上或晚上。您还可以说作业将在哪一天运行, 通过使用可选年份以月份名称日期形式给出日期,或 给出格式为 MMDDYY 或 MM/DD/YY 或 DD.MM.YY 的日期。具体 日期的阳离子必须遵循一天中的时间规范。你 也可以给出像现在这样的时间+计数时间单位,其中时间单位 可以是几分钟、几小时、几天或几周,您可以告诉 at 运行 今天的工作,通过给今天的时间加上后缀,明天运行工作 用明天作为时间的后缀。

此外,如果您需要一秒钟的时间分辨率,请让您的脚本在一分钟开始运行,然后只需休眠 n 秒直到执行时间。

【讨论】:

  • @Zak 有没有更好的方法来与这个事件队列交互?对 PHP 的系统调用不使用 opt-code 缓存并且会非常慢。如果将 curl 命中排队到 PHP url,它仍然会有点 hacky,因为它取决于系统调用。另外,这可以处理一分钟数千个请求吗?
  • 似乎您需要将其分为两种情况。场景 1:启动的请求很少,需要在数小时或数天后执行延迟事件。使用 at 来安排 php 运行您的事件。不要担心操作码优化。场景 2:您正在成长,现在每分钟获得 100 到 1000 次点击。命中是指请求添加未来的“事件触发器”。在这种情况下,我只需在数据库中输入作业,并让 cron 每分钟运行一次(也许运行一个 curl 请求)来处理那一分钟的作业。清楚地确定您是否需要稀疏调度或连续处理事件。
  • 无论如何,我都需要持续处理事件。或者至少我需要它们在预定的约 1 秒内运行。
  • 我已经用 at 进行了一些可扩展性测试,但它似乎没有达到我想要的水平。必须以非本地方式调用 PHP 的开销极大地损害了性能。我知道这是问题最初要求的,但我没有预见到这种解决方案的开销。
  • 不要批评,但许多开发人员表示,在您衡量您的性能之前,您不会遇到性能开销问题。你有通过 at 命令执行脚本需要多长时间的指标吗?
【解决方案2】:

我认为仅 PHP 的解决方案很难(几乎不可能)实现。针对您的问题,我想出了两个解决方案。

PHP/Redis 解决方案

肯德尔提出的问题:

  • redis 有多稳定:

Redis 非常稳定。开发人员确实编写了一些干净的 C 代码。你应该在 github 上查看它;)。还有很多大网站都在使用redis。例如 github。他们有一个非常有趣的博客 post 他们如何让 github 变得更快 :)。 superfeedr 也使用redis。有更多的大公司在使用 redis ;)。我建议你用谷歌搜索它;)。

  • redis 对 PHP 的友好程度如何:

PHP 对 PHP 非常友好。很多用户都在为 redis 编写 PHP 库。该协议非常简单。您可以使用 telnet 对其进行调试;)。例如,快速查看 predis 是否实现了阻塞弹出。

  • 如何删除事件:

我认为你应该使用 ZRemCommand 之类的东西。

Redis 是一种高级键值存储。 它类似于 memcached 但 数据集不是易失性的,并且值 可以是字符串,就像在 memcached,还有列表、集合和 有序集。所有这些数据类型都可以 使用原子操作进行操作 推送/弹出元素,添加/删除 元素,执行服务器端联合, 交集,集合之间的差异, 等等。 Redis 支持不同的 排序能力。

我想出了什么(伪代码....):

处理器.php:

<?php
######----processer.php
######You should do something like nohup php processor.php enough times for processors to run event. 
#$key: should be unique, but should also be used by wakeup.php
while(true) {
    $event = blpop($key); #One of the available blocking threads will wakeup and process event
    process($event); #You should write process. This could take some time so this process could not be available
    zrem($key1, $event); #Remove event after processing it. Added this later!!!!!!
}

client.php:

######----client.php
######The user/browser I guess should generate these events.
#$key1: should be unique.
#$millis: when event should run
#$event: just the event to work on.

if ("add event") {
  zadd($key1, $millis, $event);
} else if ("delete event") {
  zremove($key1, $event)
}

#Get event which has to be scheduled first
$first = zrange($key1, 0, 0);

if ($oldfirst <> $first) { #got different first event => notify wakeup.php.
    lpush($key2, $first);
}

$oldfirst = $first;

wakeup.php:

####wakeup.php
#### 1 time do something like nohup php wakeup.php
#http://code.google.com/p/redis/wiki/IntroductionToRedisDataTypes => read sorted set part.
while(true) {
    $first = zrange($key1, 0, 0);
    $event = blpop($key2, $timeoutTillFirstEvent);

    if ($event == nill) {
        #Blockingqueue has timedout which means event should be run by 1 of blocking threads.
        blpop($key2, $first);
    }    
}

您也可以使用 PHP 编写一个非常高效的调度程序(好吧,redis 是 C 这么快 :)),它也会非常高效 :)。我也想编写这个解决方案,所以请继续关注;)。我想我可以在一天内编写一个可用的原型......

我的java解决方案

今天早上我想我创建了一个java program,你可以用它来解决你的问题。

  1. 下载

    访问github's download page 下载jar 文件(包括所有依赖项)。

  2. 安装

    java -jar schedule-broadcaster-1.0-SNAPSHOT-jar-with-dependencies-1277709762.jar

  3. Run simple PHP snippets

    1. 第一php -f scheduler.php
    2. 下一个php -f receiver.php
  4. Questions

    我创建了这些小 sn-ps,希望您能了解如何使用我的程序。 WIKI 中也有一些文档。

App Engine 的任务队列

一个快速的解决方案是使用具有合理免费配额的 Google 应用引擎任务队列。之后你必须为你使用的东西付费。

使用此模型,App Engine 的任务 Queue API 允许您指定任务 作为 HTTP 请求(两者的内容 请求作为其数据,以及 请求的目标 URL 作为其代码 参考)。以编程方式引用 到这个捆绑的 HTTP 请求 时尚有时被称为“网络 钩子。”

重要的是, 任务队列 API 允许您指定 网络钩子提前,没有 等待他们的实际执行。 因此,一个应用程序可能会创建许多 立即将网络钩子交给它们 转到 App Engine;系统将 然后异步处理它们 背景(通过“调用”HTTP 要求)。这个网络钩子模型使 高效的并行处理 - 应用 引擎可以调用多个任务,或者 网络挂钩,同时进行。

总而言之,任务队列 API 允许开发人员在 背景,异步,通过 将工作分块到离线网络中 钩子。系统将调用那些 代表应用程序的网络挂钩, 通过调度以获得最佳性能 可能执行多个 webhook 在平行下。这种颗粒状模型 工作单元,基于 HTTP 标准,允许 App Engine 高效执行后台 以适合的方式处理 任何编程语言或网络 应用程序框架。

【讨论】:

  • 是否可以在我当前的 PHP 服务器所在的同一台服务器上运行它?如果没有,这将不起作用。
  • 嗨,Kendall,任务队列正在云中运行,但它使用 webhook,所以如果可以从中间的网络(没有防火墙)访问 url,那么你可以让谷歌调用指定的 url时间。否则我猜你不能使用这个解决方案。希望这能解释您的问题?
  • @Alfred 我真的不想依赖外部服务器来触发我的内部服务,似乎比使用 CRON 更落后。
  • @Alix 是这样的,但 google 的任务队列在性能和定价方面更好。
  • @Kendall 关于外部服务触发您的内部服务,您有些正确。但是任务队列非常快/稳定/便宜/易于实现。有更好的解决方案,但需要更多时间。
【解决方案3】:

这似乎是数据库中事件队列的理想场所。

让您的用户创建的事件(通过访问网页触发)在数据库中创建一个条目,其中包括要执行的操作的说明以及应该发生的时间戳。您的守护程序(持久应用程序或由 CRON 触发)检查数据库中应该发生的事件($TriggerTime &lt;= time())并且尚未标记为“已处理”。如果您发现这些事件中的一个或多个,执行指令,最后在 DB 中将事件标记为“已处理”或直接删除条目。

使用 DB 来存储事件(而不是驻留在应用程序的 RAM 中的东西)的好处是您可以从崩溃中恢复而不会丢失数据,您可以让多个工作人员同时读取一次事件,您可以简单地修改事件。

另外,有很多人使用 PHP 作为服务器等上的通用守护程序脚本语言。Cron 可以执行 PHP 脚本(并确认该“应用程序”的实例已经在运行)检查事件队列每隔一段时间。您可以有一个小应用程序在不活动一分钟后死机,然后由 CRON 重新启动。该应用程序可以以您选择的快速频率(如 1 秒)检查数据库中的条目。通常,Cron 执行计时事件的速度不能超过每分钟一次。

【讨论】:

  • 我很确定这会给数据库带来很高的负载,因为它需要在此操作期间锁定所有正在“处理”的事件,并且如果每个页面加载都试图获取它可以很容易地阻塞的锁。
  • 我也认为这可能会给您的服务器带来高负载,但我会先对解决方案进行基准测试,然后再进行过早的优化。其中一些解决方案可以为您扩展(尝试最简单的解决方案)。
【解决方案4】:

我也推荐队列策略,但您似乎不喜欢将数据库用作队列。您已经拥有 XMPP 基础架构,因此请利用它:使用 pubsub 节点并将您的事件发布到此节点。可以选择将 Pubsub 配置为以持久方式存储未获取的项目。

您的守护进程(无论是什么语言)可以在启动时获取所有存储的项目并订阅更改以获取有关传入操作的通知。通过这种方式,您可以以一种优雅的异步方式解决您的问题。

【讨论】:

  • 我只使用 XMPP 作为服务器和客户端之间的数据传输(其中服务器只是一个“特殊”客户端)。让它存储数据可能会导致比仅将数据保存在数据库中并使用 CRON 轮询它的性能更差。我确实发现 xmpp.org/extensions/xep-0203.html> 允许延迟事件,但不允许您在事件“排队”后取消事件,这意味着在我的情况下,每个事件“超时”都必须发送给所有人客户端,然后被忽略(浪费大量带宽)。
  • 我还没有放弃 ;-) 你的 XMPP 服务器是什么?如果它是可扩展的,您可以考虑为它编写一个插件并将您的调度程序/“看门狗”实现为 XMPP 组件。它通过存在服务知道哪些客户端已登录,您还可以通过 bosh 或 REST api 与您的 php 业务逻辑进行交互。那怎么样?
  • 我认为 XMPP 扩展是最佳的,但我不知道 erlang (ejabberd)。我还想将我的用户群扩展到 gtalk 和 facebook 用户,我无法接触他们的 XMPP 服务器。有一段时间我正在考虑将整个应用程序重写为 XMPP 服务器的扩展,但由于大部分服务器代码已经存在于 PHP 中,我决定放弃它。我喜欢你的想法,只是在比赛后期对我没有帮助。 :\
  • 我们遇到了类似的问题。大型 PHP 代码库和通过 xmpp 同步外部系统。我使用 xmpp 插件(openfire 服务器)和针对 PHP 业务逻辑的 REST 接口解决了这个问题(因此出于性能原因,您可以从 http 缓存中受益)。如果您不了解 erlang:也许您不需要...编写外部 xmpp 组件(想想“类固醇上的机器人”)而不是插件就足够了。我同意这是一个基本的架构决定,如果它不适合现有代码,你将很难实现它。也许你可以在另一个项目中使用它;-)
  • 有一个 XMPP 扩展协议,可让您在不修改任何服务器守护程序的情况下添加到协议中。它被称为“Jabber 组件协议”。配置您的服务器以允许您的组件,然后以您喜欢的任何语言实现您的组件。 GTalk 和其他服务器将能够通过与您的服务器进行服务器到服务器的通信来使用它。 xmpp.org/extensions/xep-0114.html
【解决方案5】:

您可以使用 Node.JS,它是一个事件驱动、基于 JavaScript 的 Web 服务器。使用脚本在一个秘密的内部端口上运行它,该脚本接收来自 PHP 脚本的通知,然后安排在 xx 秒后运行该操作。 Node.JS 中的操作可以像在主 Web 服务器上运行 PHP 脚本一样简单。

【讨论】:

    【解决方案6】:

    【讨论】:

    • 我需要能够实时处理非常高的负载。这似乎是 cron 管理器,而且是一个丑陋的管理器。
    • ...而且很糟糕,因为它只检查 PHP 请求上的事件,它可能不够精确。
    【解决方案7】:

    我不确定您为什么要避免使用 cron。您可以在表中创建一个请求队列,并让 cron 启动一个进程来检查当前作业。

    存在一些问题,具体取决于您的具体要求。例如:

    • 调用必须有多精确?
    • 每次通话需要多长时间?
    • 什么是正常负载和峰值负载 任何特定时期?

    因此,如果您想要精确执行,或者执行时间超过一秒,或者有可能产生繁​​重的负载,那么 cron 方法可能会遇到问题。

    我有许多运行 PHP 的守护进程(使用 daemontools)。使用这种方法,您可以将请求保存在核心中,并在内部执行您想要的任何时间。

    但是,如果您想要准确可靠的时间安排,您可能应该完全放弃 PHP。

    【讨论】:

    • 调用必须在秒内。调用可能很小,但在高负载下它们可能需要超过 1 秒的时间,并导致 cron 备份和数据库瓶颈。我正在尝试构建能够在每台服务器(目前可以)每秒处理 数百个 请求的系统。我很遗憾用 PHP 构建服务器,可能应该选择 node.js 或 java,但目前不太可能选择重写。
    • 我认为你需要硬着头皮离开 PHP。我以前也被这样抓过。如果您有精确的 tinming 要求和繁重的负载,那么您根本无法相信像 PHP 这样不透明的语言。我会推荐 C 或 C++(由于 JVM 和垃圾收集问题而不是 Java)并编写一个能够正确处理此问题的守护程序。如果分布式有助于扩展,那么它可以驱动像 Gearman 这样的东西。
    【解决方案8】:

    A 想不出任何能满足你要求的东西:

    • 必须非常精确
    • 长时间延迟
    • 能够删除/更改活动时间

    简单的方法是使用以下函数的组合:

    set_time_limit(0);
    ignore_user_abort(true);
    time_sleep_until(strtotime('next Friday'));
    // execute code
    

    但是,就像@deceze 所说的那样,这可能不是一个好主意,因为如果您设置高延迟,Apache 最终可能会杀死子进程(除非您使用 PHP CLI,否则会更容易)。除非您设置更复杂的逻辑和数据库来保存事件,否则它也不允许您更改/删除事件。另外,如果您想走这条路,register_shutdown_function() 可能会很有用。

    在我看来,更好的方法是设置 CRON 作业。

    【讨论】:

    • 您的简单解决方案是不可能的,因为它会占用 php proc 中的大量 RAM。 CRON 作业每秒触发一次让我不寒而栗,因为它可以在高负载时备份。
    • @Kendall:是的,它在很多方面都不完美。为什么你需要每秒触发一个 CRON 作业?只需让代码为下一个事件创建一个新的 CRON 作业,然后在完成后(或任何事件更改/删除时)将下一个事件添加到队列中。
    【解决方案9】:

    我会每隔一段时间(即 5 分钟)使用 cron 运行一个 PHP 文件。 PHP 文件将检查是否有任何事件需要在下一个间隔内触发,获取间隔事件列表,然后休眠直到下一个事件。唤醒,触发列表中的下一个事件,休眠直到下一个,重复直到完成。

    您甚至可以通过分叉或启动另一个 php 文件来实际触发事件来扩展它。然后你可以同时触发多个事件。

    【讨论】:

    • 不知道为什么这被否决了。唯一的缺点是有 5 分钟的最小事件触发时间。赞成完全合理的解决方案。
    • 谢谢,我也想不出反对票。虽然不是最佳的,但使用简单工具的极其简单的解决方案。
    【解决方案10】:

    使用任何一个 cron 来运行检查器怎么样,例如可以从数据库中执行的东西。

    或者使用“at”linux命令来调度某些命令的执行?

    【讨论】:

      【解决方案11】:

      这是正确答案,但你可能不喜欢。

      PHP 完全是围绕用作请求-响应 (http) 语言而设计的,因此不支持您正在寻找的内容 - 破解并找到解决方法很好,但它只是一个 hack ,无论你最终得到什么“解决方案”。

      您真正需要的是一种支持 xmpp 的事件驱动语言,为此您只需要查看 node.js /v8 和支持的 XMPP 库即可 - 它本机支持并专为您的需要而设计。你也可以走 Java 路线,但如果你想快速移植并获得大量新功能并支持你正在做的事情,那么 node 就是其中之一。

      如果您坚持使用 PHP(就像我多年来多次使用的那样),那么“最轻松”和最有效的方法是在数据库中使用具有事件队列的持久 PHP 守护程序 - 很遗憾!

      【讨论】:

      • 可悲的是,这个答案被修改了这么多。有一些方法可以在 PHP 中完成这项任务,是的,但它并不擅长。如果你想扩展(没有像 Facebook 那样使用 PHP 扩展的大量基础设施),你就不要使用 PHP。不管市场营销文献怎么说,PHP 并非旨在以任何方式扩展。想像 Facebook 等一样扩展吗?将您的消息传递到某种队列(支持 STOMP 的 ActiveMQ 是一个不错的选择)或传递到 scala 或 erlang 后端。现在回到我 7 月 4 日的饮酒和烧烤……
      • 干杯 Trey,并且对 erlang 和 scala 有很好的了解,许多其他语言会更好地处理(并且旨在处理)这个问题 - php 根本不会这样做,没有黑客和依赖 '其他一些过程'
      • 我没有投票给你。但我不同意 PHP 无法扩展的观点。它的扩展性可能比其他一些语言稍差,但足以在一些最大的在线网站上使用(Facebook、维基百科、Flickr、Yahoo Answers、Yahoo Bookmarks、Delicious、Digg、Friendster、SourceForge、Photobucket 等) .再加上 PHP 的扩展不足(恕我直言,这并不是很大)与 MySQL 相提并论,MySQL 是非常快的数据库,并且与 PHP 一起它们是可扩展的。
      • 可扩展性更多的是关于您如何编写应用程序而不是使用哪种技术,有些 Java/ColdFusion/etc 应用程序需要庞大的基础架构 - 类似于 Facebook - 才能正确扩展(MySpace 有人吗?他们有大量过去的可扩展性问题,如果我没记错的话,它不是用 PHP 编写的)所以它实际上与语言无关。
      • @Richard 不记得说过或暗示 PHP 无法扩展(如果我暗示它,那么道歉!)我是说 PHP 不是事件驱动语言,它是根据请求调用的提供一个响应 [end] 就是这样,通常设计用于响应 HTTP 请求时在 Web 上使用。当然,这使得它几乎可以无限扩展,因为 HTTP 是一种无状态的通用协议,而 Web 是建立在普遍性的概念之上的。因为它没有状态的概念,所以它比任何有状态的东西都更具可扩展性。再次,真诚地希望我没有暗示 PHP 不能很好地扩展 :)
      【解决方案12】:

      存在纯 PHP 解决方案。埃文在回答中所说的差不多。只需为事件引入“处理”状态,就可以减少 DB 上的负载(和锁定问题)。当处理脚本从队列 (DB) 中获取事件时,它们被标记为“正在处理”并已提交。脚本完成后,它们被标记为“已处理”。如果出现错误或脚本失败,“处理”事件必须更新回原始状态。 (这是对埃文的回答的评论,但我还没有足够的声誉)

      【讨论】:

        【解决方案13】:
        • 将所有任务存储在具有触发时间的数据库中
        • Cron 作业每小时运行一次
          • 阅读接下来 60 分钟的作业
          • 主循环
            • 无事可退
            • 微睡眠直到下一份工作
            • 在触发时间分派所有作业

        【讨论】:

          【解决方案14】:

          使用 redis 签出。可能对您的问题有用

          https://github.com/chrisboulton/php-resque-scheduler

          【讨论】:

            【解决方案15】:

            使用睡眠功能: http://php.net/sleep

            【讨论】:

            • 让脚本休眠几天可能不是一个好主意。 :)
            • @deceze 我相信 PHP 从 cli 运行时有很多问题。它泄漏了很多内存。但我相信他们已经解决了 PHP5 中的所有这些问题,并且您可以毫无问题地让脚本休眠数天。
            • @Alfred 也许是这样,但你仍然不应该。尤其是因为如果线程因任何原因终止,您所有的“排队”事件都会静默丢弃。
            • 大声笑,来点足够多的反对票!!!!!!!!!!!! @andufo 也许您应该删除帖子以免获得更多反对票。
            猜你喜欢
            • 2012-05-20
            • 1970-01-01
            • 1970-01-01
            • 2018-11-25
            • 1970-01-01
            • 2013-04-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多