服务器硬件配置

Dell PowerEdge R310英特尔单路机架式服务器

  • Intel Xeon Processor X3430 2.4GHz, 8MB Cache
  • 8GB内存(2 x 4GB), 1333MHz, 双列RDIMMs用1于处理器配置
  • 2TB近线3.5英寸7.2K RPM 6Gbps SAS硬盘 - 非热插拔
  • SAS 6/iR 控制卡
  • 8倍速SATA超薄DVD-ROM光驱
  • 非冗余电源,
    350W

软件环境

  • CentOS 6.2 minimal
  • Nginx 1.2.7
  • PHP 5.3.17
  • MySQL 5.5.28-log
  • Redis 2.6.16

一、Redis安装

1. 获取源码

shell>#
cd /usr/local/src
shell># wget http://download.redis.io/releases/redis-2.6.16.tar.gz
shell># tar -zxvf redis-2.6.16.tar.gz
shell># cd redis-2.6.16

2. 编译、安装

shell>#
make

3. 配置Redis

编辑redis.conf文件

shell>#
vi /usr/local/src/redis-2.6.16/redis.conf

daemonize
= yes

4. 启动Redis

shell>#
src/redis-server
/usr/local/src/redis-2.6.16/redis.conf

5. 测试连接

shell>#
src/redis-cli

redis>
set foo bar

OK

redis>
get foo

“bar”

redis>
exit;

二、phpredis 安装

1. 获取源码

shell>#
cd /usr/local/src

shell># wget https://github.com/nicolasff/phpredis/archive/2.2.3.tar.gz -O
nicolasff-phpredis-2.2.3.tar.gz

shell># tar -zxvf nicolasff-phpredis-2.2.3.tar.gz

shell># cd phpredis-2.2.3

2. 编译、安装

shell>#
/usr/local/php/bin/phpize

shell>#
./configure –-with-php-config=/usr/local/php/bin/php-config

shell># make &&
make install

3. 配置php.ini

shell>#
vi
/usr/local/php/etc/php.ini

extension=redis.so

4. 重启nginx & php-fpm

三、php-resque安装

*准备工作

需要pcntl支持

安装git

shell>#
yum -y install git

安装Composer

shell>#
cd
/usr/local/bin

shell># curl
–sS https://getcomposer.org/installer
| php

shell># mv composer.phpar
/usr/local/bin/composer

修改 php.ini

disable_functions = … …

将proc_open和proc_get_status以及exec删除

保存后,重启LNMP

1. 获取源码

shell>#
cd /home/wwwroot/default

shell># git
clone git://github.com/chrisboulton/php-resque.git

2. 安装

shell>#
cd php-resque

shell># composer install

四、Demo

1. 一个Job

Job|任务:一个Job就是一个需要在后台完成的任务,比如邮件发送,就可以抽象为一个Job。在Resque中一个Job就是一个Class。

shell># cd php-resque

shell># vim
demo/job.php

<?php

class PHP_Job

{

public function perform()

{

fwrite(STDOUT, 'Start job! -> ');

sleep(10);

fwrite(STDOUT, 'Job ended!' .
PHP_EOL);

}

}

这个Job的具体任务:输出’Start job! ->’,然后等待10秒钟后,再次输出’Job ended!’。

在Resque的设计中,一个Job必须存在一个perform方法,Worker则会自动运行这个方法。

2. 将Job插入队列

Queue|队列:就是标题中的消息队列。在Resque中,队列由Redis来负责实现。Resque还提供了一个简单的队列管理器,可以实现将Job插入/取出队列等功能。

shell>#
vim
demo/queue.php

<?php

if(empty($argv[1]) or empty($argv[2]))
{

die('Specify the name of a queue or job
to add. e.g, php queue.php default
PHP_Job');

//在cli命令行中运行queue.php 后面必须加上两个参数,第一个参数为queue的名称 第二个参数为job的名称,必须同之前编写的Job类的类名。

}

require __DIR__ .
'/init.php';

date_default_timezone_set('GMT');

Resque::setBackend('127.0.0.1:6379');

$args = array(

'time' => time(),

'array' => array(

'test' => 'test',

),

);

$jobId =
Resque::enqueue($argv[1], $argv[2], $args, true);

echo "Queued job
".$jobId."\n\n";

在cli方式中运行:

shell>#
php
demo/queue.php default PHP_Job

结果可以在屏幕上看到输出:

Queued
job 4ee7cefcb7df03ff5475fd450e2a5bea

即Job添加入队列成功。

3. 查看Job运行情况

php-resque同样提供了查看Job运行状态的例子,直接运行:

shell>#
php demo/check_status.php
4ee7cefcb7df03ff5475fd450e2a5bea

可以看到输出:

Tracking status of
10de5352387ba7212bc0d4e8975a3523. Press [break] to stop.

Status of 4ee7cefcb7df03ff5475fd450e2a5bea is: 1

Status of 4ee7cefcb7df03ff5475fd450e2a5bea is: 1

Status of 4ee7cefcb7df03ff5475fd450e2a5bea is: 1

我们刚才创建的Job运行状态为1。在Resque中,一个Job有以下4中状态:

  • Resque_Job_Status::STATUS_WAITING
    = 1; (等待)
  • Resque_Job_Status::STATUS_RUNNING
    = 2; (正在执行)
  • Resque_Job_Status::STATUS_FAILED
    = 3; (失败)
  • Resque_Job_Status::STATUS_COMPLETE
    = 4; (结束)

由于没有运行Worker,所以刚才创建的Job还是等待状态。

4. 运行Worker

shell>#
vim demo/resque.php

<?php

date_default_timezone_set('GMT');

require 'job.php';

require '../bin/resque';

可以看到一个Worker至少需要两部分:

1.可以直接包含Job类文件,也可以使用php的自动加载机制,指定好Job Class所在路径并能实现自动加载。

2.包含Resque中默认的Worker: bin/resque

在cli方式下运行:

shell>#
QUEUE=default
php demo/resque.php

前面的QUEUE部分是设置的环境变量,我们指定当前的Worker只负责处理default队列。也可以使用

shell>#
QUEUE=* php
demo/resque.php

来处理所有的队列。

运行后,可以看到输出:

[notice] Starting worker
s3:19060:default

[notice] Starting work on
(Job{default} | ID: 4ee7cefcb7df03ff5475fd450e2a5bea | PHP_Job |
[{"time":1378073476,"array":{"test":"test"}}])

Start job! -> Job ended!       //Job的运行结果

[notice] (Job{default} | ID:
4ee7cefcb7df03ff5475fd450e2a5bea | PHP_Job |
[{"time":1378073476,"array":{"test":"test"}}])
has finished

使用ps指令检查一下:

shell># ps aux | grep
resque

可以看到有一个php的守护进程已经在运行了

root     19060 
0.0  0.6 209680 11768 pts/0    S+  
06:12   0:01 php demo/resque.php

任务运行完毕后,同时屏幕可以看到输出结果!

至此利用Redis + php-resque实现消息队列的演示全部完成。

5. 参考资料

http://avnpc.com/pages/run-background-task-by-php-resque

http://kamisama.me/2012/10/09/background-jobs-with-php-and-resque-part-1-introduction/

Redis+php-resque实现消息队列的更多相关文章

  1. (七)整合 Redis集群 ,实现消息队列场景

    整合 Redis集群 ,实现消息队列场景 1.Redis集群简介 1.1 RedisCluster概念 2.SpringBoot整合Redis集群 2.1 核心依赖 2.2 核心配置 2.3 参数渲染 ...

  2. Redis学习笔记~实现消息队列比MSMQ更方便

    什么是队列:简单的说就是数据存储到一个空间里(可以是内存,也可以是物理文件),先存储的数据对象,先被取出来,这与堆栈正好相反,消息队列也是这样,将可能出现高并发的数据进行队列存储,并按着入队的顺序依次 ...

  3. Redis实现简单的消息队列

    1.问:什么是消息队列?  答:是一个消息的链表,是一个异步处理的数据处理引擎. 2.问:有什么好处? 答:不仅能够提高系统的负荷,还能够改善因网络阻塞导致的数据缺失. 3.问:用途有哪些? 答:邮件 ...

  4. redis分布式锁和消息队列

    最近博主在看redis的时候发现了两种redis使用方式,与之前redis作为缓存不同,利用的是redis可设置key的有效时间和redis的BRPOP命令. 分布式锁 由于目前一些编程语言,如PHP ...

  5. Redis与RabbitMQ作为消息队列的比较

    简要介绍 RabbitMQ RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性.扩展性.高可用性等方面表现不俗.消息中间 ...

  6. RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ基础知识详解,RabbitMQ布曙

    消息队列及常见消息队列介绍 2017-10-10 09:35操作系统/客户端/人脸识别 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以 ...

  7. SpringBoot2.0 整合 Redis集群 ,实现消息队列场景

    本文源码:GitHub·点这里 || GitEE·点这里 一.Redis集群简介 1.RedisCluster概念 Redis的分布式解决方案,在3.0版本后推出的方案,有效地解决了Redis分布式的 ...

  8. 使用Redis Stream来做消息队列和在Asp.Net Core中的实现

    写在前面 我一直以来使用redis的时候,很多低烈度需求(并发要求不是很高)需要用到消息队列的时候,在项目本身已经使用了Redis的情况下都想直接用Redis来做消息队列,而不想引入新的服务,kafk ...

  9. redis实现有序的消息队列

    redis是什么东西就不多说了,网上文章一搜一大堆. 首先来说一下我要实现的功能: 类似一个消息中转站吧,如果有人要发送消息,先将消息发到我这里来,然后我这边进行转发,为的就是有一个统一的管理和修改时 ...

  10. redis实现消息队列&发布/订阅模式使用

    在项目中用到了redis作为缓存,再学习了ActiveMq之后想着用redis实现简单的消息队列,下面做记录.   Redis的列表类型键可以用来实现队列,并且支持阻塞式读取,可以很容易的实现一个高性 ...

随机推荐

  1. MST_prim

    刚刚发了mst 的kruskal,现在再来一发,说一说prim咯. prim适用于稠密图. 与kruskal不同,prim是从一个点开始,不断加入新的点直至连通所有点. 讲讲prim的过程,我们假定有 ...

  2. NodeJS常用工具

    一.NodeJS版本管理器n或者nvm npm install -g n npm install n -g --registry=https://registry.npm.taobao.org --v ...

  3. 织梦DEDECMS文章、栏目页获取当前页面顶级栏目名称的方法

    在用织梦做一些项目时,时常会碰到需要在当前页面调用顶级栏目名称的时候,织梦默认{dede:field name='typename' /} 可以获取当前栏目页上一级栏目的名称,而不是当前栏目顶级栏目名 ...

  4. JVM加载class文件的原理机制

    Java中的所有类,都需要由类加载器装载到JVM中才能运行.类加载器本身也是一个类,而它的工作就是把class文件从硬盘读取到内存中.在写程序的时候,我们几乎不需要关心类的加载,因为这些都是隐式装载的 ...

  5. 解决JSP 不解析EL表达式

    解决JSP 不解析EL表达式,jsp在使用EL表达式的时候发现它不被解析,而是直接以字符串的形式显示了出来,经过查阅资料和实践,终于得知了原因并找到了解决方案 原因是:在默认情况下,Servlet 2 ...

  6. bootstrap 中是通过写less文件来生成css文件,用什么工具来编写呢?

    bootstrap 中是通过写less文件来生成css文件,用什么工具来编写呢? 如果用sublime的话如何实现代码保存后浏览器刷新成最新的代码样式? 或者有什么其他好用的工具? 从网上找了很多方法 ...

  7. jquery mobile转场时加载js失效(转)

    jquery mobile拦截了所有的http请求,并使用ajax请求取代传统的http.请求发出后,框架会将请求的内容插入到页面中data- role="page"的部分,取代原 ...

  8. Maven项目中,编译proto文件成Java类

    新建Maven项目 新建一个 Maven 项目: pom定义了最小的maven2元素,即:groupId,artifactId,version. groupId:项目或者组织的唯一标志,并且配置时生成 ...

  9. (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在

    问题描述:在用vs生成MVC时若使用Internet应用程序为模版,项目建好后重新编译下无法通过,弹出错误: 解决方案:问题出来后,询问了身边很多人都是一头雾水,于是乎各种谷歌和百度,还好功夫不负有心 ...

  10. 你不知道的JavaScript 二

    词法作用域 上次说到作用域,将其定义为一套规则,这套规则用来管理引擎如何在当前作用 域以及嵌套的子作用域中根据标识符名称进行变量查找. 作用域共有两种主要的工作模型.第一种是最为普遍的,被大多数编程语 ...