heristop / jobqueue-bundle
此包提供使用来自Zend Framework的Zend_Queue。它允许您的Symfony应用程序安排多个控制台命令作为服务器端作业。
Requires
- php: >=5.4.0
- symfony/console: ~2.7|~3.0
- symfony/finder: ~2.7|~3.0
- symfony/framework-bundle: ~2.7|~3.0
- zendframework/zend-queue: 2.0.*@dev
Requires (Dev)
- doctrine/doctrine-bundle: ~1.2
- doctrine/orm: ~2.5
- symfony/monolog-bundle: ~2.7|~3.0
- symfony/process: ~2.7|~3.0
Suggests
- php-amqplib/php-amqplib: AMQP library
- react/event-loop: Event Loop Component
- zendframework/zend-json: 2.0.*
This package is not auto-updated.
Last update: 2024-09-14 14:46:40 UTC
README
此包提供使用来自Zend Framework的Zend Queue
的功能。它允许您的Symfony 2/3应用程序安排多个控制台命令作为服务器端作业。
有关更多信息,请参阅程序员参考指南。
特性
- 管理多个队列
- 安排您的Symfony命令
- 监控消息和记录异常
- 重试逻辑
- 作业优先级
- RabbitMQ或数据库支持
- 易于使用 :)
安装
将heristop/jobqueue-bundle
添加到您的composer.json
文件中
{ "require": { "heristop/jobqueue-bundle": "1.0.1", "zendframework/zend-queue": "2.*@dev" } }
在AppKernel中加载包
$bundles[] = new Heri\Bundle\JobQueueBundle\HeriJobQueueBundle();
如果您使用Doctrine适配器,请更新您的数据库
app/console doctrine:schema:update --force
如果您使用Amqp适配器,您可能需要这样配置连接
# app/config/config.yml heri_job_queue: amqp_connection: host: localhost port: 5672 user: guest password: guest
使用
首先,定义一个包含要调用的Symfony命令的消息。例如,我们选择将清除命令添加到名为"queue1"的队列中
$queue = $this->get('jobqueue'); $queue->attach('queue1'); $queue->push([ 'command' => 'cache:clear' ]);
您也可以使用参数调用命令
$queue->push([ 'command' => 'demo:great', 'argument' => [ 'name' => 'Alexandre', '--yell' => true ] ]);
然后,在配置中添加要监听的队列
# app/config/config.yml heri_job_queue: enabled: true max_messages: 1 # set a process_timeout (in seconds) if you want your commands to be killed # when their execution time is too long (default: null) process_timeout: 60 queues: [ queue1 ]
注意:队列会自动创建,但您也可以使用命令行界面这样使用
app/console jobqueue:create queue1
监听器命令
运行监听器
要运行推入队列的新消息,请执行此命令
app/console jobqueue:listen
指定特定队列
您可以指定监听器应使用的队列连接(跳过配置)
app/console jobqueue:listen queue1
指定睡眠持续时间
您还可以指定在轮询新作业之前等待的秒数
app/console jobqueue:listen --sleep=5
处理队列上的第一个作业
要仅处理队列上的第一个作业,您可以使用jobqueue:work
命令
app/console jobqueue:work
显示作业
要查看挂起的作业,请运行以下命令
app/console jobqueue:show [queue-name]
失败的作业
如果作业失败,异常将记录在数据库中,并在设置的超时(默认90秒)后再次调用命令
要删除所有失败的作业,您可以使用jobqueue:flush
命令
app/console jobqueue:flush [queue-name]
作业优先级
作业将按照它们安排的顺序执行(假设它们在同一个队列中)。您也可以对调用进行优先级排序
$queue ->highPriority() ->push([ 'command' => 'cache:clear', ]);
作业监控
如果您使用Doctrine适配器,您可以使用Sonata Admin监控您的作业
# # more information can be found here http://sonata-project.org/bundles/admin # sonata_admin: # ... dashboard: # ... groups: # ... System: label: System icon: '<i class="fa fa-wrench"></i>' items: - admin.queue
重试策略
默认情况下,失败消息的执行次数是无限制的。如果您使用Doctrine适配器,您可以编辑队列表上的最大重试次数。
要重试所有失败的作业,您可以使用此命令
app/console jobqueue:retry [queue-name]
如果您想删除一个失败的作业,您可以使用此命令
app/console jobqueue:forget [id]
配置守护进程
应使用prod环境并带quiet选项运行jobqueue:listen
命令以隐藏输出消息
app/console jobqueue:listen --env=prod --quiet
为了避免由monolog fingers crossed处理器引起的内存泄漏,您可以在config_prod.yml
上配置限制缓冲区大小
# app/config/config_prod.yml monolog: handlers: main: type: fingers_crossed action_level: error handler: nested buffer_size: 50
Linux技巧
要将命令作为服务运行,请编辑Resources/bin
中的jobqueue-service
shell。设置正确的PROJECT_ROOT_DIR
值,并将此文件复制到/etc/init.d
。
然后使用update-rc.d
cp jobqueue-service /etc/init.d/jobqueue-service cd /etc/init.d && chmod 0755 jobqueue-service update-rc.d jobqueue-service defaults
要删除服务,请使用此命令
update-rc.d -f jobqueue-service remove
如果服务突然停止,您可以使用supervisord
自动重启它。
一个示例配置可能如下所示
[program:jobqueue-service]
command=/usr/bin/php %kernel.root_dir%/console jobqueue:listen --env=prod
directory=/tmp
autostart=true
autorestart=true
startretries=3
stderr_logfile=/var/log/jobqueue-service/jobqueue.err.log
stdout_logfile=/var/log/jobqueue-service/jobqueue.out.log
user=www-data
~