應用情境
一、群發業務
這些業務的特點就是不是很要求即時性,可以保證統計,支援查看進度,可將不成功的任務重扔回隊列,又可以手動剔除一些重複不正常的任務。
二、資料移轉業務
因為資料庫的特性不能一庫走天下,所以在使用者發布內容時,能夠進行較為即時的資料移轉
根據目前未知的熱心回答簡單總結
一、 crontab + php
為什麼沒有人提到swoole workman?
不管怎麼樣,我是都點了贊 …………
回複內容:
應用情境
一、群發業務
這些業務的特點就是不是很要求即時性,可以保證統計,支援查看進度,可將不成功的任務重扔回隊列,又可以手動剔除一些重複不正常的任務。
二、資料移轉業務
因為資料庫的特性不能一庫走天下,所以在使用者發布內容時,能夠進行較為即時的資料移轉
根據目前未知的熱心回答簡單總結
一、 crontab + php
為什麼沒有人提到swoole workman?
不管怎麼樣,我是都點了贊 …………
php-resque,內建dashborad可以查看任務執行情況
php-resque-scheduler 支援延時執行任務,比如多少小時之後
ruby版的resque貌似還支援cron,但是php版的resque是不支援的。
甭想了用php resque吧,基於redis的,夠快!
指令碼,不斷的消費
crontab
php指令碼,生命週期設定為10min
crontab計劃5分鐘調用一次,這樣可以保證有2個任務一直在工作
===========================================
針對題主第一個問題,做任務隊列,可以放到redis的隊列中,這是單線程的,保證不會有兩個進程獲得一個任務
用隊列,可以看看php_resque。
crontab也可以,但是頻率比較固定不太好控制。
寫指令碼迴圈的話需要開一個守護進程,不然進程掛了都不知道,不推薦。
可以試試php的多線程:pthreads
其實使用一個PHP 指令碼一直去擷取MQ 中的資料,並對資料進行消費。然後使用 supervisor 或者daemonise 做守護也是可以的。不過PHP 指令碼還是有一個最長已耗用時間比較好,這樣可以定時的釋放一些沒有釋放的記憶體,然後由守護進程重啟
laravel解決這個問題用了兩個辦法:
crontab,每一分鐘跑一次。
隊列(redis+supervisord)。,實際上就是supervisord不斷起進程去消費,消費完了進程停止,supervisor檢測到於是重新起進程。適用於小並發。
總結起來無非:死迴圈/觸發。
while(true){ //如果隊列空了 sleep幾秒 //處理過程 //處理完一條usleep幾毫秒,別把伺服器拖垮}
守護進程這一塊可以使用swoole來搞就可以了。
使用swoole即可
我的做法是用Workman
去執行一個死迴圈,當然用swoole
也是很好的
簡單對於消費隊列常見的做法基本差不多了
配置crontab,每分鐘都運行,運用一個shell,
此shell要判斷當前有沒有消費進程在,shell中時是死迴圈
例如
if ( 'test.php'進程存在 ) { exit()}while( true ){ sleep 1 php test.php}
用 supervisor 或者daemonise 做守護,結合mq,一般的業務不成問題