1

全部,

我正在寻找一种通过这两种服务中的任何一种来做一些后台工作的好方法。

我看到 PHPFog 支持 IronWorks,但我需要更实时的东西。通过这些基于云的 PaaS 服务,我无法使用popen(background.php --token=1234). 所以我在想最好的解决方案,可能是试着让一个齿轮工来处理这项工作。(实际上我首选的方法是使用 websockets 来保持连接打开并从工作中接收反馈,而不是通过 AJAX 长时间轮询数据库表,但是这些人都不支持 websockets)

问题 1 是,有没有比使用 gearman 卸载工作更好的解决方案?

问题 2 是,http: //help.pagodabox.com/customer/portal/articles/430779 我看到 pagodabox 支持“工人听众”……有人用 gearman 设置了吗?它会起作用吗?

谢谢

4

1 回答 1

2

我在我现在正在构建的应用程序中使用 PagodaBox 和后台工作人员。基本上,PagodaBox 会为您守护一个 PHP 进程(这意味着它将在后台持续运行),因此您真正需要做的就是创建一个脚本来检查数据库表中要运行的任务,运行它们,然后稍微休眠一下它没有对您的数据库运行太多查询。

这是我正在运行的简化版本:

// Remove time limit
set_time_limit(0);

// Show ALL errors
error_reporting(-1);

// Run daemon
echo "--- Starting Daemon ---\n";
while(true) {

    // Query 'work_queue' table for new tasks
    // Loop over items and do whatever tasks are associated with them
    // Update row to mark task as completed

    // Wait a bit
    sleep(30);
}

这种方法的一个好处是它很容易通过 CLI 进行测试:

php tasks.php

您将echo在控制台运行时看到所有语句,当然这比使用其他依赖项(如 Gearman)的更复杂的设置要容易得多。

因此,每当您向表中添加新任务时,您将等待该任务批量启动的最长时间为 30 秒(或任何您的睡眠时间)。这比 cron 作业更好,更可取,因为如果您将 cron 作业设置为每分钟运行一次(可能的最低间隔)并且您必须执行的工作需要超过一分钟,另一个 cron 进程将开始在同一个队列上工作并且您最终可能会完成大量重复的任务工作,这可能会导致许多难以调试和排除故障的问题。因此,如果您只有一个运行所有任务的后台工作人员,或多个处理不同任务类型的后台工作人员,您将永远不会遇到这个问题。

于 2012-12-01T17:46:45.473 回答