基于Phalapi框架的gearman扩展(异步并发)
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
Gearman
PhalApi-example
.gitignore
README.md

README.md

基于Phalapi框架的gearman扩展(异步并发)

描述

提到异步并发,phper往往会想到swoole,但是其仅支持cli模式的特性,以及比较难读的文档,却总是令人却步。此时,使用gearman也许是个不错的选择。

gearman使用场景

gearman是异步工具,当后端在处理一些用时较长且不需即时回调的请求的时候,异步IO可以有效提高响应速度。比如:后台发送邮件、发送短信验证码、存储行为日志等等。 而且,gearman支持非cli模式,这意味着基于TCP协议的接口调用也可以进行异步请求了。

gearman安装

可以参考这篇博客《CenOS7环境安装PHP7扩展

(以下操作均在命令行模式下运行)

  • 安装german

yum install -y gearman-server gearmand

  • 安装必备的依赖

yum install -y php-devel php-pear httpd-devel libgearman libgearman-devel

  • 下载gearman-php扩展

cd /usr/src ; git clone https://github.com/wcgallego/pecl-gearman.git;

cd pecl-gearman/ ; /usr/local/php7/bin/phpize ;./configure --with-php-config=/usr/local/php7/bin/php-config;make; make install;

  • 修改php.ini

vim /usr/local/php7/lib/php.ini

  • 在END前加上 extension=gearman.so;

  • 重启php-fpm

service php-fpm restart

  • 启动gearman

gearmand -d

正式使用前的准备

  • 从github下载,地址: https://github.com/AxiosCros/PhalApi-Gearman
  • 将Gearman目录复制到phalapi框架中的Library目录中
  • 根据项目情况修改Gearman/gearman-server.php文件(同phalapi的入口文件)
  • 修改Phalapi框架的应用配置文件Config/app.php,添加如下配置
 'gearman'=>array(
        "servers"=>"127.0.0.1:4730",
        "task"=>array(
            'testTask'         =>  "Test.task",
        )
    ),
  • 运行Gearman/run.sh

sh run.sh 1 #运行后会在Library/Gearman/目录下生成一个nohup.out文件,也就是gearman运行时的输出文件。最后的参数 1 为生成1个worker

基于PhalApi的使用

  • 入口注册gearman服务

DI()->gearman = new Gearman_Lite(DI()->config->get('app.gearman'));

  • 调用gearman扩展的task方法,如:

DI()->gearman->task('default.index',$data); //其中default.index是要执行task任务的接口,$data是要传入的参数

  • 接收gearman异步请求中的参数时,可以使用phalapi的 DI()->request->getAll();方法

测试实例

  • 部署PhalApi-example并运行gearman,(参考#正式使用前的准备)
  • 打开一个终端窗口(A),观察gearman输出文件,
  tail -f Library/Gearman/nohup.out
  • 另外再打开一个终端窗口(B),查看worker状态
watch -n 1 "(echo status; sleep 0.1) | nc 127.0.0.1 4730"
  • 访问Index.index接口

  • 然后观察,最开始在B终端会看到有job正在执行,然后在A终端中会出现gearman的输出结果