phlask / phlask
PHP 并行任务管理。
Requires
- php: >=5.3.27
- monolog/monolog: 1.6.*
Requires (Dev)
- mockery/mockery: >=0.8.0
- phpunit/phpunit: 3.7.*
- squizlabs/php_codesniffer: 1.*
This package is not auto-updated.
Last update: 2024-09-28 14:43:00 UTC
README
可以在分布式环境中运行的任务运行器,从队列中消费任务并在单独的进程中并行运行任务。没有任何进程会相互影响,因此允许任何任务在几乎任何语言中运行,即使在某些(或所有)任务失败时也能继续运行任务。
当前可用的队列有 MongoDB(目前正在为 RabbitMQ 构建)。其他队列接口计划包括 Redis、Amazon SQS 和 MySQL。
构建状态
如何使用此工具?
$runner = \phlask\Runner::factory(array( 'tasks' => new \phlask\TaskQueue\MongoQueue($host, $db, $collection), 'wait' => 20, 'daemon' => false, 'max_processes' => 10 )); $runner->run();
在最简单的情况下,创建一个 \phlask\Runner 实例,该实例将读取 MongoDB 队列中的任务并运行,直到所有任务运行完成并退出。或者,可以通过在工厂中将 daemon 配置设置为 true 来将应用程序作为守护进程在后台运行。以这种方式,Runner 将在后台运行,一旦任务在队列中可用就会消费任务。请注意,daemon 标志旨在表示此进程可以在后台运行(即没有 PHP 的超时),但实际上创建守护进程的任务由使用此库的开发者完成。有关更多信息,请参阅关于 创建守护进程 的说明。
创建作业
只要作业遵循 \phlask\TaskSpecInterface,就可以创建任何可能的作业,该接口定义了一些确定“运行作业”含义的方法。这种作业的概念是有意抽象的,以便允许库的用户编写自己的任务规范,这些规范可以在任何知道队列的主机上立即运行。
一个简单的任务示例可以在 \phlask\TaskSpec\PhpRunnable 中找到,可以以这种方式创建。假设你想运行位于此文件中的 PHP 脚本:/home/me/file.php。你可以这样设置你的任务
$task = \phlask\TaskSpec\PhpRunnable::factory(array( 'file' => '/home/me/file.php', 'php' => '/usr/bin/php' ));
就这么简单。你还可以通过指定配置中的 args 来传递额外的参数。
现在,你需要将其添加到某个队列中。假设你正在使用 MongoDB 队列。这相当简单。只需将你刚刚创建的任务推送到队列中
$queue = new \phlask\TaskQueue\MongoQueue('mongodb://127.0.0.1', 'db', 'queue'); $queue->pushTask($task);
这就是添加作业到队列所需的所有操作。
运行作业
运行作业需要以某种方式启动 Runner,无论是运行有限数量的任务还是作为守护进程在后台运行,监听队列以运行新任务。有许多不同的方法可以创建守护进程脚本。你可以阅读更多关于 创建守护进程 的信息。
为了创建一个功能性的 Runner,我们需要了解任务队列和一些基本的启动设置。
$runner = \phlask\Runner::factory(array( 'tasks' => new \phlask\TaskQueue\MongoQueue('mongodb://127.0.0.1', 'myDb', 'queue'), 'wait' => 20,//milliseconds for waiting for new tasks 'daemon' => true,//run in the background 'max_processes' => 10//maximum parallel processes )); $runner->run();
tasks 配置指向队列的一个实例。它可以是指实现 phlask\TaskQueueInterface 的任何队列。在这个例子中,我们选择了本地主机的 MongoDB。wait 配置表示在队列中没有任务时我们应该等待多少毫秒。建议设置 max_processes 以防止当你的任务队列充满许多作业时,并行运行太多进程。daemon 标志将允许 Runner 以守护进程模式运行。
贡献
如果你想为此项目做出贡献,请发起一个 pull request。我很乐意看到更多队列实现或 TaskSpecInterface 实现被添加进来。