1. 程式人生 > >php-resque 簡單的php消息隊列

php-resque 簡單的php消息隊列

IT zone win color bbc path shell all 發現

摘要: 消息隊列是個好東西,各種×××MQ很多。然而看一下它們的文檔,你得嚇尿,什麽鬼,我只是想用它觸發個短信接口而已。 幸好也有簡單的。這次是php-resque

安裝

  • 首先這貨需要在linux下跑,非得用windows就別看了,也不是不能裝,費勁且性能渣
  • 得有composer,嫌慢的也拉倒吧,別看了,本文不介紹沒有composer怎麽辦
  • 安裝composer也不是本文要點,在ubuntu(其實為了不折騰QQ我裝的是deepin)中就是一行命令
  • php版本要高一點,5.4以下也別看了
  • 該環境php是apt裝的,所以一切無阻礙,如果是編譯安裝可能不會這麽順暢

安裝composer

sudo apt-get install composer

安裝redis

redis是個數據庫,nosql。不是廢話,因為有人的確不知道

sudo apt-get install redis-server

還得有git

sudo apt-get install git

真正的安裝

cd /your/www/path
git clone git://github.com/chrisboulton/php-resque.git
cd php-resque
composer install

不出意外的話能安裝成功,抽風就多試幾次,包不大,可忍受

demo

網上有些demo,都是抄的同一個博文,爾等能找到這裏很可能是那一篇看了覺得不大對頭。 composer安裝的包裏面有demo,裏面的代碼也TM坑的很。所以還是看我這篇。。。。

首先咱們寫個簡單的job

job,工作,就是碎催,接到消息之後幹活的,好,定義明確了

<?php
// job.php 放在demo目錄裏面,原有的那個刪了算球

class TestJob
{
    public function perform()
    {
        echo $this->args[‘name‘];
    }
}

再寫個腳本往隊列裏寫消息

<?php
// demo/quere.php 註意,這個是個命令行版,需要在shell中運行,也可以自己寫個瀏覽器裏能跑的
// 功能,往隊列裏寫一些裝逼犯的名字
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‘); $names = [ ‘李靈黛‘,‘冷文卿‘,‘陰露萍‘,‘柳蘭歌‘,‘秦水支‘,‘李念兒‘,‘文彩依‘,‘柳嬋詩‘,‘顧莫言‘,‘任水寒‘,‘金磨針‘,‘丁玲瓏‘,‘淩霜華‘,‘水笙‘,‘景茵夢‘,‘容柒雁‘,‘林墨瞳‘,‘華詩‘,‘千湄‘,‘劍舞‘,‘蘭陵‘,‘ 洛離‘ ]; foreach($names as $name){ $jobId = Resque::enqueue(‘default‘, ‘TestJob‘, [‘name‘ => $name]); echo "Queued job " . $jobId . "\n\n"; }``` ## 寫個守護進程腳本 ```php <?php // demo/resque.php照抄原demo,會發現找不到文件,所以可以照抄我這個 // 這個腳本也是在shell裏跑的,真正應用應該放進開機啟動裏面 date_default_timezone_set(‘GMT‘); require ‘bad_job.php‘; require ‘job.php‘; require ‘php_error_job.php‘; require ‘/install-path/php-resque/bin/resque‘;

試一下

先啟動守護進程

QUEUE=* php demo/resque.php

會有以下輸出

#!/usr/bin/env php
[notice] Starting worker your-computer-name:10757:*

另開一個終端,鍵入

php demo/queue.php TestJob

會有類似下面輸出,那些hash串就是任務id了

Queued job 4b510e225af5897bd5022fee30d202bf

Queued job d14a2ed9339f739b2dec0e0c64069dd7

Queued job d58a536dab2fde9aa6097b37577bd02a

Queued job 53ed1a64d7d8e9a4fed15a0942587e64

Queued job 178ea9087a159c9c7b74b8d9d87e40c2

Queued job cc5dd2087de6865e613fcfdebd52abbc

Queued job e647351c4a83b04b3d701a5dafa52118

Queued job 3f69bd449888e5adb5984a0d64aeb3ac

Queued job 31e114326c8db42443029e14bd677cdb

Queued job 28404f8202a22ade5d204345596d10e0

Queued job fefcf7c402b09c92de2eac5aa642ca80

Queued job e6ecf1529d97e568c5f80bb330c423f2

Queued job c92e64ca49948e7547a5dacce2f373fb

Queued job 97a504c56d74f7714781318b6d244ae6

Queued job 2f8e51937016fc981e0426fcef5d1643

Queued job db3be312811732803fc5d7b814cc69d4

Queued job 23124e4693146812471c09401137a6fd

Queued job af070ce348f73c6c6fe25782351a1937

Queued job 8825fc73b7881e13067e59d10287b598

Queued job 21e31139c9f70c7097927a80a442a577

Queued job 283a8d6119657dd018a5cc8298021bba

這時你看剛才運行守護進程的那個終端,會有類似以下輸出,如願輸出了一系列裝逼犯

[notice] Starting work on (Job{default} | ID: 3dcf4dc9008d255ab59917a221aaf984 | TestJob | [{"name":"\u674e\u7075\u9edb"}])
李靈黛[notice] (Job{default} | ID: 3dcf4dc9008d255ab59917a221aaf984 | TestJob | [{"name":"\u674e\u7075\u9edb"}]) has finished
[notice] Starting work on (Job{default} | ID: fa2d6bd7a97a77ab754c35822cb8dcd0 | TestJob | [{"name":"\u51b7\u6587\u537f"}])
冷文卿[notice] (Job{default} | ID: fa2d6bd7a97a77ab754c35822cb8dcd0 | TestJob | [{"name":"\u51b7\u6587\u537f"}]) has finished
[notice] Starting work on (Job{default} | ID: 0962a49c4ffd3e987864b2c7e2fdf857 | TestJob | [{"name":"\u9634\u9732\u840d"}])
陰露萍[notice] (Job{default} | ID: 0962a49c4ffd3e987864b2c7e2fdf857 | TestJob | [{"name":"\u9634\u9732\u840d"}]) has finished
[notice] Starting work on (Job{default} | ID: 51ecee3f45d0ba8a906c438ad8ad1887 | TestJob | [{"name":"\u67f3\u5170\u6b4c"}])
柳蘭歌[notice] (Job{default} | ID: 51ecee3f45d0ba8a906c438ad8ad1887 | TestJob | [{"name":"\u67f3\u5170\u6b4c"}]) has finished
[notice] Starting work on (Job{default} | ID: 6dbdf11ee30ab874a94d239d93637671 | TestJob | [{"name":"\u79e6\u6c34\u652f"}])
秦水支[notice] (Job{default} | ID: 6dbdf11ee30ab874a94d239d93637671 | TestJob | [{"name":"\u79e6\u6c34\u652f"}]) has finished
[notice] Starting work on (Job{default} | ID: e566a95f0666dcca8fa30c1ed984434f | TestJob | [{"name":"\u674e\u5ff5\u513f"}])
李念兒[notice] (Job{default} | ID: e566a95f0666dcca8fa30c1ed984434f | TestJob | [{"name":"\u674e\u5ff5\u513f"}]) has finished
[notice] Starting work on (Job{default} | ID: 826cfe9d90f06f06f19c790bae54955d | TestJob | [{"name":"\u6587\u5f69\u4f9d"}])
文彩依[notice] (Job{default} | ID: 826cfe9d90f06f06f19c790bae54955d | TestJob | [{"name":"\u6587\u5f69\u4f9d"}]) has finished
[notice] Starting work on (Job{default} | ID: 106843bea773add35576cb796f5a2036 | TestJob | [{"name":"\u67f3\u5a75\u8bd7"}])
柳嬋詩[notice] (Job{default} | ID: 106843bea773add35576cb796f5a2036 | TestJob | [{"name":"\u67f3\u5a75\u8bd7"}]) has finished
。。。
。。。
。。。

打完收工

這裏是個簡單例子,實際上幹啥都行,發短信,發郵件,執行不那麽著急的數據庫操作等等,只管job.php裏面寫個新class即可,往隊列裏些消息的時候註意標明一下參數就行

Resque::enqueue(default, ClassName, [參數一 => $param1, 參數二 => $param2,]);

簡單應用完全夠了

抄襲自https://my.oschina.net/inuxor/blog/635959

php-resque 簡單的php消息隊列