horrible / gearman-bundle
Horrible gearman bundle
Requires
- php: >=5.6 || >=7.0
- symfony/symfony: ~3.0 || ~2.7
Requires (Dev)
- phpunit/phpunit: >=4.7
This package is not auto-updated.
Last update: 2024-09-27 18:20:04 UTC
README
配置
-
将以下配置添加到您的 config.yml 文件中
horrible_gearman: servers: - { host: '127.0.0.1' } - { host: '127.0.0.1', port: '47031' } retries: 3
- 服务器 - Gearman 服务器的数组,您可以忽略 'port' 字段,Gearman 将使用默认端口。
- 重试 - 如果作业抛出异常,则重试的次数
-
将 bundle 初始化添加到 app/AppKernel.php
class AppKernel extends Kernel { public function registerBundles() { $bundles = [ ... new Horrible\GearmanBundle\HorribleGearmanBundle(), ]; } ... }
-
创建自己的 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'; } }
-
将作业注册为服务,并为其添加带有名称 'horrible.gearman.job' 的标签
services.yml
services: your.job: class: AppBundle\Job\Job tags: - { name: 'horrible.gearman.job' }
-
启动工作进程
要启动工作进程,您应该调用命令 'horrible:worker:work'。如果您需要在后台启动您的作业进程,可以这样做
Symfony < 3 版本
php app/console horrible:worker:work &
Symfony >= 3 版本
php bin/console horrible:worker:work &
-
通过客户端添加任务
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...
}
}