heristop/jobqueue-bundle

此包提供使用来自Zend Framework的Zend_Queue。它允许您的Symfony应用程序安排多个控制台命令作为服务器端作业。

安装: 890

依赖: 0

建议者: 0

安全: 0

星级: 15

关注者: 6

分支: 6

开放问题: 0

类型:symfony-bundle

v1.0.1 2016-08-09 07:24 UTC

This package is not auto-updated.

Last update: 2024-09-14 14:46:40 UTC


README

SensioLabsInsight Scrutinizer Code Quality Build Status

此包提供使用来自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秒)后再次调用命令

ScreenShot

要删除所有失败的作业,您可以使用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

ScreenShot

重试策略

默认情况下,失败消息的执行次数是无限制的。如果您使用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
~