horrible/gearman-bundle

Horrible gearman bundle

安装: 29

依赖项: 0

建议者: 0

安全: 0

星星: 0

关注者: 2

分支: 0

开放问题: 0

类型:symfony-bundle

1.0.2 2016-05-31 11:21 UTC

README

Travis Build Status

Coverage Status

配置

  1. 将以下配置添加到您的 config.yml 文件中

    horrible_gearman:

        servers:

            - { host: '127.0.0.1' }

            - { host: '127.0.0.1', port: '47031' }

        retries: 3
    
    • 服务器 - Gearman 服务器的数组,您可以忽略 'port' 字段,Gearman 将使用默认端口。
    • 重试 - 如果作业抛出异常,则重试的次数
  2. 将 bundle 初始化添加到 app/AppKernel.php

    class AppKernel extends Kernel
    {
        public function registerBundles()
        {
            $bundles = [
                ...
                new Horrible\GearmanBundle\HorribleGearmanBundle(),
            ];
        }
        ...
    }
    
  3. 创建自己的 Job 实现 JobInterface。重要的是要给出您的作业名称(这样您可以通过客户端使用此作业名称来访问您的作业)。还要实现您的 'execute' 方法,您可以在其中获取 WorkloadInterface 实例。

    <?php
    
    namespace AppBundle\Job;
    
    use Horrible\GearmanBundle\Job\JobInterface;
    use Horrible\GearmanBundle\Workload\WorkloadInterface;
    
    class Job implements JobInterface
    {
        /**
         * {@inheritDoc}
         */
        public function execute(WorkloadInterface $workload)
        {
            $data = $workload->getDecodedData();
            //do your stuff
        }
    
        public function getName()
        {
            return 'your:job:name';
        }
    }
    
  4. 将作业注册为服务,并为其添加带有名称 'horrible.gearman.job' 的标签

    services.yml

    services:
        your.job:
            class: AppBundle\Job\Job
            tags:
                - { name: 'horrible.gearman.job' }
    
  5. 启动工作进程

    要启动工作进程,您应该调用命令 'horrible:worker:work'。如果您需要在后台启动您的作业进程,可以这样做

    Symfony < 3 版本

    php app/console horrible:worker:work &
    

    Symfony >= 3 版本

    php bin/console horrible:worker:work &
    
  6. 通过客户端添加任务

    SomeController.php

    $workload = new SimpleWorkload();
    $workload->setDecodedData([
        'some your data' => 'value',
        ...
    ]);
    
    $this->get('horrible.gearman.client')->doBackground('your:job:name', $workload);
    

    工作负载数据将作为 json 编码(在 SimpleWorkload 的情况下)并传递给 Gearman,您将在 Job->execute 方法中作为 WorkloadInterface 实例获取它

    大多数 'horrible.gearman.client' 方法与 GearmanClient (https://php.ac.cn/manual/ru/class.gearmanclient.php) 相同,但它们使用 WorkloadInterface 实例而不是字符串作为工作负载

    工作负载 不是必需参数,如果您省略它,您将在作业中获取 WorkloadInterface 实例,其值为 '0'。

事件

Bundle 有几种类型的事件

  • JobStartedEvent ('horrible.event.job.started') - 在作业开始之前触发,包含

    • $jobName (字符串)
    • $workload (WorkloadInterface 实例)
    • $workerId (字符串) - 正在处理当前作业的工作进程 ID
  • JobFinishedEvent ('horrible.event.job.finished') - 在作业成功完成后触发,包含

    • $jobName (字符串)
    • $workload (WorkloadInterface 实例)
    • $jobResult (混合) - 从 Job->execute() 方法返回的数据
    • $workerId (字符串) - 正在处理当前作业的工作进程 ID
  • JobFailedEvent ('horrible.event.job.failed') - 在作业开始之前触发,包含

    • $jobName (字符串)
    • $workload (WorkloadInterface 实例)
    • $exception (对象) - 作业抛出的异常实例
    • $workerId (字符串) - 正在处理当前作业的工作进程 ID

要捕获这些事件,您应该使用标签

services.yml

services:
    my.event.listener:
        class: AppBundle\EventListener\MyEventListener
        tags:
            - { name: 'horrible.event_listener', event: 'horrible.event.job.started', method: 'onJobStarted' }
            - { name: 'horrible.event_listener', event: 'horrible.event.job.finished', method: 'onJobFinished' }
            - { name: 'horrible.event_listener', event: 'horrible.event.job.failed', method: 'onJobFailed' }

MyEventListener

<?php

namespace AppBundle\EventListener;

use Horrible\GearmanBundle\Event\JobFailedEvent;
use Horrible\GearmanBundle\Event\JobFinishedEvent;
use Horrible\GearmanBundle\Event\JobStartedEvent;

class MyEventListener
{
    public function onJobStarted(JobStartedEvent $event)
    {
        $jobName = $event->getJobName();
        $workload = $event->getWorkload();
        $workerId = $event->getWorkerId();
        //Do your stuff...
    }

    public function onJobFinished(JobFinishedEvent $event)
    {
        $jobName = $event->getJobName();
        $workload = $event->getWorkload();
        $jobResult = $event->getJobResult();
        $workerId = $event->getWorkerId();
        //Do your stuff...
    }

    public function onJobFailed(JobFailedEvent $event)
    {
        $jobName = $event->getJobName();
        $workload = $event->getWorkload();
        $exception = $event->getException();
        $workerId = $event->getWorkerId();
        //Do your stuff...
    }
}