php的基于redis队列系统:php-resque

概述:

      项目中遇到很多处理时间长任务的需求,如短信,上传文件,邮件,处理大量的数据等,用户体验度差;

如果能先给用户一个成功的提示,然后慢慢处理发送短信邮件等的操作,显然会有更好的用户体验。

php-resque

    php有个队列php-resque依赖包整理下;

    注:以下队列都是在php-resque的基础上进行;

    php-resque 也是一种先进先出的基于redis队列;

    github地址:https://github.com/chrisboulton/php-resque

    目前已运用到本公司的很多项目中;

 1.启动条件

  • PHP 5.3+
  • Redis 2.2+
  • Optional but Recommended: Composer
    composer 解释说明:Dependency Manager for PHP, PHP的一个依赖管理工具,类似nodejs的npm; 其中管理了很多的开发好的代码等;建议学习;

    1).安装php、redis 略

    2).安装composer

        安装全局命令:

              curl -sS https://getcomposer.org/installer | php

              mv composer.phar /usr/local/bin/composer

        安装成功后:

                    命令: composer -V

                          Composer version 1.0.2 2016-04-21 12:30:18     ->我本地的版本为1.0.2

 

2.前期安装准备好后就是初始化项目了

 

     用终端进入在项目目录下(当然可以为任意目录) ;

    1).composer 初始化:   

           命令:composer init

           初始化后会出现composer.json 文件,其中管理依赖的包和项目说明等;

    2).安装项目所需的依赖包:

          就我们队列所需的依赖包php-resque,和medoo的包

          那安装命令为 : composer require chrisboulton/php-resque

                                     composer require catfan/Medoo

                                     .....

           composer工具管理了很多的包,相关搜索依赖包:https://packagist.org  或者命令composer search  ...

          安装完后composer.json中会出现以上两个所安装包名,及多出composer.lock文件和vendor文件等;

          composer 实现了自动加载的机制,自动引入依赖包;

          将下面这行代码添加到你项目的引导文件中:

    require 'vendor/autoload.php';

 

3.了解该队列的名词:

  • Job | 任务 : 一个Job就是一个需要在后台完成的任务,比如本文举例的发送邮件,就可以抽象为一个Job。在Resque中一个Job就是一个Class。
  • Queue | 队列 : 也就是上文的消息队列,在Resque中,队列则是由Redis实现的。Resque还提供了一个简单的队列管理器,可以实现将Job插入/取出队列等功能。
  • Worker | 执行者 : 负责从队列中取出Job并执行,可以以守护进程的方式运行在后台。

4.任务加入队列

   以下主要代码

/*addQueue.php  加入队列的入口文件*/
<?php
require 'vendor/autoload.php';
date_default_timezone_set('GMT');
//连接本地的redis ,redi默认端口为6379
Resque::setBackend('127.0.0.1:6379');
//任务参数,在JOB_TEST类中可以接受到
$args array(
    'time' => time(),
    'array' => array(
        'test' => 'test',
    ),
);
//加入队列,或者叫压入队列末尾;如下参数解释:arg1为任务名称,arg2为任务处理类,arg3为任务所需参数,arg4为是否有返回结果的任务id
$jobId = Resque::enqueue('default''JOB_TEST'$args, true);
//显示任务id
echo "Queued job ".$jobId."\n\n";
?>
 
 
/*JOB_TEST.php   队列处理类*/
<?php
class JOB_TEST
{
    //执行方法入口,
    public function perform()
    {
        fwrite(STDOUT, 'Start job! -> ');
        echo $this->args['time'];                //$this->args 是加入队列的参数,就是arg3对应的数组;
        fwrite(STDOUT, 'Job ended!' . PHP_EOL);
    }
}

     当然这只是加入队列的入口,和队列处理类;并没有进行两者进行关联起来;

    加入队列的入口的说明: 也就是addQueue.php , 就是将一个或多个值插入到列表的尾部。见Redis Rpush 命令;当然此时没有执行;只是加入,等待worker的执行者执行(下面说明worker);

    队列处理类的说明:就是JOB_TEST.php,  将该队列名下任务处理核心;比如短信发送,邮件发送,文件下载代码等等都可以写入在此;

 

5.Worker 队列worker进程

    负责从队列中取出Job并执行,也是此php-resque 的运行的关键所在;

   这里需要启动进程去执行;而worker需要包含所有的Job和vender/php-resque/resque.php的文件;

   如启动队列进程命令:

     QUEUE=* COUNT=1 REDIS_BACKEND=localhost:6379 VVERBOSE=1 INTERVAL=5 APP_INCLUDE=JOB_TEST.php php vender/php-resque/resque.php

开启进程参数说明:

     QUEUE: 必须的参数.它指定了Queue的优先级别,靠前的会优先执行.如:QUEUE=email,log 如果使用QUEUE=*表示执行所有任务.
     APP_INCLUDE: 包含文件,比如APP_INCLUDE=./worker_jobs.php, worker_jobs.php里面包含Worker需要调用的Jobs的PHP Class.
    COUNT: 设置Worker数量,默认是1. 如:COUNT=3
    REDIS_BACKEND: 设置Redis的IP, PORT等,默认为localhost:6379
    VERBOSE: 显示简单的debug信息,使用VERBOSE=1即可.
    VVERBOSE: 显示详细的debug信息,使用VVERBOSE=1即可.
    INTERVAL: Worker检查Queue的时间间隔.默认是:INTERVAL=5
    PIDFILE: 如果是只开单个Worker的话,可以将pid写入PIDFILE指定的文件. 如:PIDFILE=/var/run/phpresque.pid

 

posted @ 2016-10-13 16:05  boby_zhang  阅读(300)  评论(0)    收藏  举报