p3k/caterpillar

Caterpillar是一个后台队列管理器

0.1.2 2017-03-19 19:58 UTC

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