p3k / caterpillar
Caterpillar是一个后台队列管理器
Requires
- php: >5.4.0
- pda/pheanstalk: 3.*
This package is auto-updated.
Last update: 2024-08-28 09:02:27 UTC
README
Caterpillar是一个基于beanstalkd的队列机制。它处理入队和任务处理,以及管理多个可以处理相同队列的并发工作者。
您可以通过运行多个工作者来快速并行化后台任务。
安装
从源代码下载或使用Composer。
git clone git@github.com:aaronpk/caterpillar.git
将以下内容添加到您的composer.json文件中的"require"部分
"p3k/caterpillar": "0.1.*"
用法
在example
文件夹中的工作示例在下面有更详细的说明。
队列任务
要队列任务,首先创建一个新的Caterpillar
对象,并传入您要使用的beanstalkd管子名称,以及beanstalkd服务器和写入日志文件的路径。
$c = new Caterpillar('caterpillar-test', '127.0.0.1', 11300, $logdir);
您可以将任何类的任何静态方法入队运行。为了说明目的,我们将使用以下测试任务。它所做的只是说它在运行,等待一定的时间,然后完成。
class TestTask { public static function run($val) { echo "Running task $val ...\n"; usleep(rand(750000,2000000)); echo "finished!\n"; } }
现在我们将入队10个任务,每个任务都有一个随机编号,这样在日志中看起来更好。
for($i=0; $i<10; $i++) {
$c->queue('TestTask', 'run', [rand(1000,9999)]);
}
运行工作者
要运行工作者,创建一个脚本来在Caterpillar
类上运行run_workers
命令。您需要首先创建一个与队列工作相同的Caterpillar对象来设置其配置。然后只需运行带有您想要运行的并发进程数的run_workers
方法作为第一个参数。脚本将创建这么多子进程,它们将在父进程中并行运行。
require_once(__DIR__.'/vendor/autoload.php'); // Make sure you load your environment and any of the classes that are being used as workers. $logdir = __DIR__.'/log/'; $c = new Caterpillar('caterpillar-test', '127.0.0.1', 11300, $logdir); $c->run_workers(2); // Runs two workers in the foreground
当您从控制台运行时,父进程保持在前景。您可以通过按CTRL+C并等待几秒钟让它们完成来退出所有工作者。
如果您想将父进程在后台运行,例如使用某些系统初始化方法时,可以将true
作为第二个参数传递,例如$c->run_workers(2, true)
。
作为系统服务运行
对于生产使用,您可能会想将工作者作为系统服务运行,这样它们在服务器启动时启动,并自动继续运行。如何做这取决于您使用的特定操作系统。您需要配置一个系统级启动脚本来运行我们上面描述的工作者文件。
systemd
对于使用systemd的Ubuntu,您可以创建一个类似于下面的初始化脚本,并将其保存为/etc/init/yourservice.conf
description "caterpillar worker"
start on runlevel [2345]
stop on runlevel [016]
respawn
exec sudo -u ubuntu /usr/bin/php /web/sites/example.com/scripts/worker.php >> /web/sites/example.com/scripts/logs/init.log 2>&1
supervisord
使用supervisord,您可以创建一个类似于下面的配置文件,并将其保存为/etc/supervisor/conf.d/yourservice.conf
[program:example]
process_name=%(program_name)s_%(process_num)02d
command=php /web/sites/example.com/scripts/worker.php
autostart=true
autorestart=true
user=www-data
numprocs=4
redirect_stderr=true
stdout_logfile=/web/sites/example.com/logs/init.log
API文档
new Caterpillar($tube, $server, $port, $log_path)
创建Caterpillar对象,并配置它使用特定的管子、beanstalkd服务器和日志路径。
$tube
:(默认为"default"管子) 要使用的beanstalkd管子名称$server
:(默认127.0.0.1) beanstalkd服务器的IP地址或主机名$port
:(默认11300) beanstalkd服务器的端口$log_path
:(默认"./log/") 所有日志文件要使用的路径
queue($class, $method, $args, $opts)
将新作业入队到管子。
$class
:(字符串) 要运行的任务的类名$method
:(字符串) 类中要运行的静态方法名称$args
: (数组) 这个数组作为参数传递给静态函数。如果你在数组中包含3个项,那么你的函数必须接受3个参数。$opts
: (数组) **delay
: (默认0) 在任务可由工作者使用之前要等待的秒数 **ttr
: (默认300) 任务的“运行时间”以秒为单位。如果任务在时间结束前未完成,它将被beanstalkd放回队列。 **priority
: (默认1024) 为任务设置的beanstalkd优先级数字。
run_workers($num, $background)
以单独的子进程运行指定的工作者数量。
$num
: (整数) 要运行的孩子数量$background
: (true, false) 是否在后台还是前台运行父进程
print_stats()
输出有关待处理、延迟、埋藏的工作数量以及监视beanstalkd管道的进程数量的信息。
示例输出
tube urgent ready delayed buried using watching
default 0 0 0 0 1 1
caterpillar-test 0 2 0 0 0 0
有关每个选项的更多详细信息,请参阅beanstalkd文档。
待办事项
- 修复日志轮换。找出为什么子进程无法捕获父进程发送的HUP信号。
许可证
版权所有 2015-2017 由Aaron Parecki
在Apache 2.0许可证下可用。请参阅LICENSE.txt