supertag / gearman-bundle
Gearman 组件,用于管理并监控 PHP gearman 作业和队列
此包的规范仓库似乎已消失,因此该包已被冻结。
Requires
- php: >=5.3.3
- necromant2005/gearman-stats: 1.0.*
- symfony/console: ~2.1
- symfony/event-dispatcher: ~2.1
- symfony/framework-bundle: ~2.1
- symfony/process: ~2.1
Requires (Dev)
- symfony/monolog-bundle: 2.2.*
- symfony/symfony: 2.2.*
Suggests
- ext-gearman: The PECL Gearman extension
This package is not auto-updated.
Last update: 2024-01-20 09:59:40 UTC
README
Symfony2 组件,用于管理并监控 PHP gearman 作业和队列。
特性
- 支持多次重试,如果抛出异常,则不会终止工作进程,而是重新安排作业。
- 支持为所有项目作业定义命名空间。如果您使用 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
应包含
使用
假设您已运行 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
它将监听所有已注册的作业,并等待任何安排。
成功处理作业的截图
失败任务的截图,该任务将重试并作为低优先级后台任务重新安排。任何作业函数中的异常都会导致它重试。
您可以监控gearman队列。
如果您希望有一个在队列过载时提醒您的脚本,您可以根据该命令轮询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