專案中經常會有後台運行任務的需求,例如發送郵件時,因為要連接郵件伺服器,往往需要5-10秒甚至更長時間,如果能先給用戶一個成功的提示訊息,然後在後台慢慢處理發送郵件的操作,顯然會有更好的使用者體驗。
為了實現類似的需求,Web專案中一般的實作方法是使用訊息佇列(Message Queue),例如MemcacheQ,RabbitMQ等等,都是很著名的產品。
訊息佇列說白了就是一個最簡單的先進先出佇列,佇列的一個成員就是一段文字。正是因為訊息佇列太簡單了,當拿著訊息佇列時,反而有點無從下手的感覺,因為這僅僅一個發送郵件的任務,就會引申出很多問題:
訊息佇列只能儲存字串類型的數據,如何將一個發送郵件這樣的“任務”,轉換為訊息佇列中的一個“訊息”?
apt-get install redis-server
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'
apt-get install git git-core cd /opt/htdocs git clone git://github.com/chrisboulton/php-resque.git cd php-resque composer installphp-resque的使用 #寫一個Worker其實php-resque已經給了簡單的例子, demo/job.php檔就是一個最簡單的Job:
class PHP_Job { public function perform() { sleep(120); fwrite(STDOUT, 'Hello!'); } }這個Job就是在120秒後向STDOUT輸出字元Hello!在Resque的設計中,一個Job必須存在一個perform方法,Worker則會自動執行這個方法。
php-resque也给出了最简单的插入队列实现 demo/queue.php:
if(empty($argv[1])) { die('Specify the name of a job to add. e.g, php queue.php PHP_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('default', $argv[1], $args, true); echo "Queued job ".$jobId."\n\n";
在这个例子中,queue.php需要以cli方式运行,将cli接收到的第一个参数作为Job名称,插入名为'default'的队列,同时向屏幕输出刚才插入队列的Job Id。在终端输入:
php demo/queue.php PHP_Job
结果可以看到屏幕上输出:
Queued job b1f01038e5e833d24b46271a0e31f6d6
即Job已经添加成功。注意这里的Job名称与我们编写的Job Class名称保持一致:PHP_Job
php-resque同样提供了查看Job运行状态的例子,直接运行:
php demo/check_status.php b1f01038e5e833d24b46271a0e31f6d6
可以看到输出为:
Tracking status of b1f01038e5e833d24b46271a0e31f6d6. Press [break] to stop. Status of b1f01038e5e833d24b46271a0e31f6d6 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还是等待状态。
这次我们直接编写demo/resque.php:
<?php date_default_timezone_set('GMT'); require 'job.php'; require '../bin/resque';
可以看到一个Worker至少需要两部分:
可以直接包含Job类文件,也可以使用php的自动加载机制,指定好Job Class所在路径并能实现自动加载
包含Resque的默认Worker: bin/resque
在终端中运行:
QUEUE=default php demo/resque.php
前面的QUEUE部分是设置环境变量,我们指定当前的Worker只负责处理default队列。也可以使用
QUEUE=* php demo/resque.php
来处理所有队列。
运行后输出为
#!/usr/bin/env php *** Starting worker
用ps指令检查一下:
ps aux | grep resque
可以看到有一个php的守护进程已经在运行了
1000 4607 0.0 0.1 74816 11612 pts/3 S+ 14:52 0:00 php demo/resque.php
再使用之前的检查Job指令
php demo/check_status.php b1f01038e5e833d24b46271a0e31f6d6
2分钟后可以看到
Status of b1f01038e5e833d24b46271a0e31f6d6 is: 4
任务已经运行完毕,同时屏幕上应该可以看到输出的Hello!
至此我们已经成功的完成了一个最简单的Resque实例的全部演示,更复杂的情况以及遗留的问题会在下一次的日志中说明。
相关推荐:
利用redis和php-resque实现后台任务 redis 下载 redis 集群 redis可视化工具
以上是php-resque使用說明的詳細內容。更多資訊請關注PHP中文網其他相關文章!