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 加入队列的入口文件*/<?phprequire 'vendor/autoload.php';date_default_timezone_set('GMT');//连接本地的redis ,redi默认端口为6379Resque::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);//显示任务idecho "Queued job ".$jobId."\n\n";?> /*JOB_TEST.php 队列处理类*/<?phpclass 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

浙公网安备 33010602011771号