many/gearman 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

many/gearman

Composer 安装命令:

composer require many/gearman

包简介

laravel-gearman

README 文档

README

一个简单的laravel for gearman 服务

Latest Stable Version Build Status Latest Unstable Version License

描述:

该包是gearmn服务对laravel的一个适配方案,参照 laravel-gearman 进行了扩展,安装之前确保php gearman扩展安装以及gearman服务已正确安装,具体的安装方案可以参考 gearman服务安装

安装:

使用composer安装 composer require many/gearman

  • 进入laravel项目,修改配置文件 config/app.php ,首先需要注释掉原有队列服务器提供者的代码:

    //'Illuminate\Queue\QueueServiceProvider::class',

    然后添加自定义的服务器提供者:

    'Phphc\Gearman\GearmanServiceProvider::class',

  • 接着在 config/queue.php 文件中添加:

    'connections' => array(
      //追加内容 start
      'gearman' => array(
          'driver' => 'gearman',
          'host'   => '127.0.0.1',
          'queue'  => 'default',
          'port'   => 4730,
          'timeout' => 300
      )
    )
    

    如果你有多个Gearman服务器:

    'connections' => array(
      'gearman' => array(
          'driver' => 'gearman',
          'hosts'  => array(
              array('host' => '127.0.0.1', 'port' => 4730),
              array('host' => '127.0.0.2', 'port' => 4730),
          ),
          'queue'  => 'default',
          'timeout' => 300
      )
    )
    
  • 修改 laravel 项目根目录 .evn 的配置为:

    `QUEUE_DRIVER=gearman`  
    
  • 接下来执行发布命令 php artisan vendor:publish --tag=gearman --force

  • 然后使用composer 自动加载命令 composer dump-autoload

  • 启动gearman服务 gearmand -d -l /var/run/log/gearmand.log

  • 在终端执行服务端:php artisan queue:work 客户端: php artisan gearman:test
    最终效果如下图:
    success

  • 多个终端同时运行 php artisan queue:work 可以达到并行处理任务的效果。服务端的进程守护建议使用 laravel 官方推荐的 supervisor。

说明:

在执行命令 php artisan vendor:publish --tag=gearman --force 导入了两个文件到项目中

  • job 脚本:app/Service/SumServer.php 和 client 脚本:app/Console/Commands/Workers.php
    • SumServer.php 核心代码:
         
         public function fire($job, $data)
          {
              $result=$data[0] + $data[1];
              //模拟任务消耗时间
              sleep(2);
              echo "Client results:{$result}\n";
              return $result;
          }
    • Workers.php 核心代码:
          public function seedWork()
              {
                  $sum = 0;
                  //实例化gearman服务的客户端
                  $client = new GearmanClient();
                  //默认参数主机地址:127.0.0.1 端口:4730
                  $config = config('queue.gearman');
                  if (isset($config['hosts'])) {
                      foreach ($config['hosts'] as $server) {
                          $client->addServer($server['host'], $server['port']);
                      }
                  } else {
                      $client->addServer($config['host'], $config['port']);
                  }
          
                  //可以通过setCompleteCallback函数给计算结果返回给客户端
                  $client->setCompleteCallback(function (GearmanTask $task) use (&$sum) {
                      $sum = $task->data();
                      $this->info("Server results:" . $sum . "\n");
                  });
          
                  for ($i = 0; $i < 2; $i++) {
                      //后期版本会封装单独的类来匹配数据项
                      $data = [
                          "displayName" => "App\\Services\\SumServer",
                          "job" => "App\\Services\\SumServer",
                          "maxTries" => null,
                          "timeout" => null,
                          "data" => [1 + $i, 2 + $i]
                      ];
                      //添加任务
                      $client->addTask('default', json_encode($data, 1));
                  }
                  //添加任务
          
                  $client->runTasks();
              }
  • 当laravel队列监听任务启动时,默认将名为 default 的函数 注册到gearman服务中,在终端可以通过命令 gearadmin --status 查看,在 $client->addTask 添加任务的时候第一个参数为函数名,第二个参数为需要提交到job中的数据。$data1 数组的 displayNamejob 项是需要处理任务的命名空间名,data项才是最终 SumServer 接收到的值。
  • 值得注意的是 SumServer 中的 fire 函数包含两个参数 $job$data接收到客户端的数据 array(1, 2)
  • 服务端的进程守护建议使用 laravel 官方推荐的 supervisor

使用方法:

app/Service 文件夹下新增一个名为: SendMail.php 的类

<?php
    namespace App\Services;

    class SendMail {

        public function fire($job, $data)
        {
            mail('pavel@taskprocess.com', 'gearman test', $data['message']);
        }

    }

在你的web路由中添加:

    
    Route::get('/gearman', function() {
        foreach (array(1,2,3) as $row) {
            Queue::push('App\Services\SendMail', array('message' => 'Message' . $row));
        }
    });
    

Bugs

如果发现有任何问题,请提交issue

many/gearman 适用场景与选型建议

many/gearman 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 23 次下载、GitHub Stars 达 4, 最近一次更新时间为 2017 年 11 月 27 日, 在 PHP 生态内属于活跃度较高的组件。

我们在过去多个企业项目中使用过 many/gearman 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 many/gearman 我们能提供哪些服务?
定制开发 / 二次开发

基于 many/gearman 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 23
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 4
  • 点击次数: 5
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 4
  • Watchers: 2
  • Forks: 1
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2017-11-27