在PHP的页面编程过程中,我们总遇到这样一个问题,即是PHP是一个顺序执行的过程,只能在一个任务完成后接着去实现下一个任务,而这其中存在一个问题,就是假如其中一个任务耗费大量时间的时候,我们可能就必须要等待。借助redis可以将耗时任务放到后台去执行,从而减少等待时间。
Redis 是一个高性能的key-value数据库。可以帮助我们有效的实现后台任务,将耗费大量时间的任务迁移到后台去执行,可以节约很多的时间。
php-resque是来自Ruby的项目Resque的一个PHP扩展,正是由于Resque清晰简单的解决了后台任务带来的一系列问题。
在Resque中后台任务的角色划分:
在Resque中,一个后台任务被抽象为由三种角色共同完成:
Job | 任务 : 一个Job就是一个需要在后台完成的任务,比如发送邮件,就可以抽象为一个Job。在Resque中一个Job就是一个Class。
Queue | 队列 : 也就是上文的消息队列,在Resque中,队列则是由Redis实现的。Resque还提供了一个简单的队列管理器,可以实现将Job插入/取出队列等功能。
Worker | 执行者 : 负责从队列中取出Job并执行,可以以守护进程的方式运行在后台。
那么基于这个划分,一个后台任务在Resque下的基本流程是这样的:
1、将一个后台任务编写为一个独立的Class,这个Class就是一个Job。
2、在需要使用后台程序的地方,系统将Job Class的名称以及所需参数放入队列。
3、以命令行方式开启一个Worker,并通过参数指定Worker所需要处理的队列。
4、Worker作为守护进程运行,并且定时检查队列。
5、当队列中有Job时,Worker取出Job并运行,即实例化Job Class并执行Class中的方法。
至此就可以完整的运行完一个后台任务。
在Resque中,还有一个很重要的设计:一个Worker,可以处理一个队列,也可以处理很多个队列,并且可以通过增加Worker的进程/线程数来加快队列的执行速度。
注:本文中的安装等操作,均在Linux下完成。
步骤一、php-resque的安装
此处可参阅:PHP的轻量消息队列php-resque使用说明
需要提前说明的是,由于涉及到进程的开辟与管理,php-resque使用了php的PCNTL函数,所以只能在Linux下运行,并且需要php编译PCNTL函数。如果希望用Windows做同样的工作,那么可以去找找Resque的其他语言版本,php在Windows下非常不适合做后台任务。
安装Redis
apt-get install redis-server
安装Composer
apt-get install curl
cd /usr/local/bin
curl -s http://getcomposer.org/installer | php
chmod a+x composer.phar
alias composer='/usr/local/bin/composer.phar'
使用Composer安装php-resque
假设web目录在/opt/htdocs
apt-get install git git-core
cd /opt/htdocs
git clone git://github.com/chrisboulton/php-resque.git
cd php-resque
composer install
至此php-resque即可完成,可以进行其使用。
步骤二:php-resque的使用
首先需要运行Worker。
此处可参阅:后台任务和PHP-Resque的使用介绍
1、理解Worker的本质
技术上讲一个Worker就是一个不断运行的PHP进程,并且不断监视新的任务并运行。
一个简单的Worker的代码如下:
while (true) {
$jobs = pullData(); // 从队列中拉取任务
foreach ($jobs as $class => $args) { // 循环每个找到的任务
<