在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
服务器硬件配置
一、Redis安装1. 获取源码shell>#
cd /usr/local/src 2. 编译、安装shell># make 3. 配置Redis编辑redis.conf文件 shell># vi /usr/local/src/redis-2.6.16/redis.conf daemonize = yes 4. 启动Redisshell>#
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
2. 编译、安装shell># /usr/local/php/bin/phpize
shell># ./configure –-with-php-config=/usr/local/php/bin/php-config
shell># make && make install 3. 配置php.inishell># vi /usr/local/php/etc/php.ini
4. 重启nginx & php-fpm
三、php-resque安装*准备工作 需要pcntl支持 安装git shell># yum -y install git 安装Composer shell># cd /usr/local/bin
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 2. 安装shell># cd php-resque
四、Demo1. 一个JobJob|任务:一个Job就是一个需要在后台完成的任务,比如邮件发送,就可以抽象为一个Job。在Resque中一个Job就是一个Class。
shell># cd php-resque
<?php class PHP_Job { public function perform() { fwrite(STDOUT, 'Start job! -> '); sleep(10); fwrite(STDOUT, 'Job ended!' . PHP_EOL); } }
在Resque的设计中,一个Job必须存在一个perform方法,Worker则会自动运行这个方法。 2. 将Job插入队列Queue|队列:就是标题中的消息队列。在Resque中,队列由Redis来负责实现。Resque还提供了一个简单的队列管理器,可以实现将Job插入/取出队列等功能。
shell># vim demo/queue.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中状态:
由于没有运行Worker,所以刚才创建的Job还是等待状态。 4. 运行Workershell># 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/ |
2022-08-17
2022-11-06
2022-08-18
2022-08-15
2022-08-16
请发表评论