我在我现在正在构建的应用程序中使用 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 进程将开始在同一个队列上工作并且您最终可能会完成大量重复的任务工作,这可能会导致许多难以调试和排除故障的问题。因此,如果您只有一个运行所有任务的后台工作人员,或多个处理不同任务类型的后台工作人员,您将永远不会遇到这个问题。