rpm -ivh epel-release-6-8.noarch.rpm #安裝epel擴充套件
yum -y install redis #安裝redis
yum install php-redis #安裝php擴充套件
service redis start #啟動redis伺服器
chkconfig redis on
#設定redis開機啟動
list在redis中是乙個雙向佇列,我們可以從佇列的左邊入隊,從佇列的右邊出隊。這樣就可以實現先來先服務的佇列操作。
每當收到伺服器請求時,將待處理的資訊,從list的左邊插入。
$params
= json_encode($_request);
$redis
->lpush($key,$params);
編寫指令碼,通過crontab定時執行指令碼,從list的右邊取出錯誤處理。
這種方式的優點是不會出現資料的丟失,只有定時指令碼處理完相關資訊之後,才從佇列中取出;缺點也是顯而易見的,響應不夠及時,因為是定時訪問redis的list隊形,所以不能實時的處理佇列中的訊息。
$params
=$redis
->rpop($key);
定時從佇列中取出資訊,可以採用php指令碼sleep的方式,也可以使用crontab實現。
php實現
while(true)
crontab實現
*
* ** * sleep 20; /usr/bin/php /var/www/html/handler.php #20s執行一次
*/1 *
* * * /usr/bin/php /var/www/html/handler.php #每分鐘執行一次
在redis中,我們支援一種發布訂閱機制,就像無線電廣播一樣。a訂閱了乙個頻道之後,如果b在該頻道發布了訊息之後,a就能收聽到。
每當收到伺服器請求時,將待處理的資訊,發布到對應頻道。
$params
= json_encode($_request);
$redis
->publish($channel,$params);
編寫指令碼,在linux後台一直執行,實時監聽該頻道廣播的訊息。
這種方式的優點是可以實時的處理資料,並且是redis主動向php指令碼推送訊息;缺點是有可能會有資料的丟失,因為訊息的發布是實時性的,該發布/訂閱通道不儲存訊息,僅僅作為訊息傳遞的渠道,如果訊息沒有被訂閱的指令碼捕捉到,則會導致資料的丟失。
handler.php
$redis->subscribe(array($channel), 'handlefun');
function
handlefun
($redis, $chan, $msg)
上面的資料處理指令碼handler.php,一直在後台執行。
我們可以使用下面命令在後台執行
nohup /usr/bin/php /var/www/handler.php >> /tmp/handler.log 2>&1 &
我們為了防止指令碼意外終止(發生錯誤等情況)不再工作,我們寫乙個定時任務監控該指令碼的執**況。
monitor.sh
#!/bin/bash
alive=`ps aux|grep \/usr\/bin\/php|grep -v grep|wc -l`
if [ $alive
-eq0 ]
then
nohup /usr/bin/php /var/www/handler.php >> /tmp/handler.log 2>&1 &
fi
crontab -e
*/1 * * * * /var
/www/monitor.sh
個人分類:
php運維技術
php使用redis作為訊息佇列
rpm ivh epel release 6 8.noarch.rpm 安裝epel擴充套件 yum y install redis 安裝redis yum install php redis 安裝php擴充套件 service redis start 啟動redis伺服器 chkconfig re...
基於PHP使用rabbitmq實現訊息佇列
1.從github上面獲取amqp基於php的實現擴充套件 2.建立生產者 send.php 1 require dir protected vendor autoload.php 23 usephpamqplib connection amqpstreamconnection 4use phpam...
部落格306 Go使用緩衝chan作為訊息佇列
內容 go中的chan可以作為訊息佇列 chan 1 chan分為帶緩衝和不帶緩衝 2 帶緩衝的chan可以作為訊息佇列,用於削峰減流,增大吞吐 3 不帶緩衝的chan可以作為一種同步goruntine的方法例項 package main import runtime func main ci ma...