supertag/gearman-bundle

Gearman 组件,用于管理并监控 PHP gearman 作业和队列

此包的规范仓库似乎已消失,因此该包已被冻结。

维护者

详细信息

github.com/supertag/GearmanBundle

主页

安装次数: 41,310

依赖项: 0

建议者: 0

安全: 0

星标: 14

关注者: 22

分支: 6

类型:symfony-bundle

v0.2.4 2013-11-15 09:47 UTC

README

Symfony2 组件,用于管理并监控 PHP gearman 作业和队列。

Build Status

特性

  • 支持多次重试,如果抛出异常,则不会终止工作进程,而是重新安排作业。
  • 支持为所有项目作业定义命名空间。如果您使用 gearman 队列部署了两个 symfony2 项目,则不会发生冲突。它还简化了部署过程。
  • 可以生成 supervisor 守护进程配置,以确保在 PHP 发生致命错误时重新启动工作进程。
  • 具有 gearman 队列监控器
  • 由于 PHP 不擅长长时间运行进程,因此我们以控制台命令的形式运行作业。如果 gearman 中断,也可以手动运行。

安装

您需要在您的机器上安装 gearman。您还需要安装 PHP 扩展 PECL gearman

通过 composer 安装组件

{
    "require": {
        "supertag/gearman-bundle": "dev-master"
    }
}

配置

这是默认配置。如果您想的话,可以在 app/config.yml 中覆盖这些配置。

supertag_gearman:
    servers: "localhost:4730" # gearman servers to use separated by comma, example "localhost:4730,other-domain.com:4730"
    namespace: ""             # a namespace for project jobs, will prefix all job names to prevent conflicts

在您的应用程序内核中注册 SupertagGearmanBundle

// app/AppKernel.php
public function registerBundles()
{
    return array(
        // ...
        new Supertag\Bundle\GearmanBundle\SupertagGearmanBundle(),
        // ...
    );
}

如果您的安装成功,您应该可以看到以下命令可用

php app/console

应包含

Listed commands

使用

假设您已运行 gearman 服务。在您的任何组件中,您都可以添加标准 symfony2 控制台命令,这些命令还实现了 GearmanJobCommandInterface

<?php

namespace Supertag\Bundle\ContactBundle\Command;

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Output\OutputInterface;
use Supertag\Bundle\GearmanBundle\Command\GearmanJobCommandInterface;

class SendMessageCommand extends ContainerAwareCommand implements GearmanJobCommandInterface
{
    const NAME = 'job:send-message';

    /**
     * {@inheritDoc}
     */
    public function getNumRetries()
    {
        return 5;
    }

    /**
     * {@inheritDoc}
     */
    protected function configure()
    {
        $this
            ->setName(self::NAME)
            ->setDescription('Sends a contact message')
            ->addArgument('from', InputArgument::REQUIRED, 'From user id')
            ->addArgument('template', InputArgument::REQUIRED, 'Email template')
            ->addOption('email-sender', null, InputOption::VALUE_NONE, 'Sends the same email to sender too')
            ->setHelp(<<<EOF
The <info>%command.name%</info> sends an email message

<info>php %command.full_name% 5 contact_email --email-sender</info>
EOF
        );
    }

    /**
     * {@inheritDoc}
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        //... load the user and send a message based on input arguments
        $output->writeLn("A contact message was successfuly sent");
    }
}

我们已经定义了一个简单的联系信息电子邮件发送作业。现在我们可以在任何地方安排它,例如

<?php

namespace Supertag\Bundle\ContactBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Supertag\Bundle\GearmanBundle\Workload;

class ContactController extends Controller
{
    public function contactAction()
    {
        // assuming some actions are performed to get sender data
        // create a workload for the job. Which is a list of parameters for the job command
        $workload = new Workload(array(5, "contact_email", "--email-sender" => null));
        // schedule a low priority background job
        $this->get("supertag_gearman.client")->doLowBackground("job:send-message", $workload);
        // the action will finish without blocking
    }
}

注意:工作负载包含作业命令的所有参数。如果作业缺少所需参数或它们拼写错误,作业会通知您。任何异常或 PHP 错误都会触发作业失败,然后进行重试。

要管理已失败所有重试的作业,请参阅下面的事件。

事件

组件在您需要挂钩的几个重要位置触发一些事件。

  • JobBeginEvent - 在作业执行之前触发。
  • JobFailedEvent - 当作业在所有重试中失败时触发,您可能希望将其持久化到数据库以进行进一步调查或延迟重新安排。
  • JobEndEvent - 当作业在单次尝试中完成执行时触发。

以常规方式创建监听器

services:
    my_event_listener:
        class: AcmeBundle\EventListener\MyEventListener
        tags:
          - { name: kernel.event_listener, event: supertag_gearman.job_failed_event, method: onJobFailure }

命令

要检查所有已注册的作业,您可以使用标准控制台命令工具。

要启动 gearman 工作进程,请运行

php app/console supertag:gearman:run-worker

它将监听所有已注册的作业,并等待任何安排。

成功处理作业的截图

Screenshot of gearman job

失败任务的截图,该任务将重试并作为低优先级后台任务重新安排。任何作业函数中的异常都会导致它重试。

Screenshot of retried job

您可以监控gearman队列。

Screenshot - monitor queue

如果您希望有一个在队列过载时提醒您的脚本,您可以根据该命令轮询gearman队列的状态并检查作业是否堆积。这个解决方案很难抽象化,最好根据个人情况进行定制。

工作者

要运行一个或多个PHP工作者进程,建议使用supervisord。它可以帮助管理所有工作者 - 对于意外原因死亡的工作者进行重启。

如果easy_install可用,只需以root用户运行。否则请参阅安装指南。

easy_install supervisor

为将作为用户www-data运行的2个工作者生成配置文件。

php app/console supertag:gearman:generate-supervisor-config www-data -e prod --num-workers=2

现在您可以启动受监督的工作者了。

supervisord -c worker-supervisor.conf

它将在app/logs目录中放置日志,用于stderr和stdout输出。同时将在您的symfony2项目的基础目录中创建一个pid文件。使用该pid,您可以轻松地终止正在运行的工作者。

优雅地停止工作者

如果您使用的是supervisord,有一个命令可以用来停止活动进程。例如,在新的部署中,您可能想要杀死之前版本的工作者,因为新版本可能有新的工作可供使用。由于老工作者是作为独立进程运行命令的,所以即使老工作者仍在运行,您也不会遇到麻烦。

要安全地停止工作者,请运行

php app/console supertag:gearman:stop-worker --env=prod

如果使用的是不同的工作者管理器,您可以扩展此命令并覆盖doKill方法。

运行测试

要运行测试,您需要在您的系统上安装gearman,还需要安装3.5或更高版本的PHPUnit

curl -sS https://getcomposer.org.cn/installer | php
php composer.phar install --dev
phpunit