簡單定時任務解決方案:使用redis的keyspace notifications(鍵失效后通知事件) 需要注意此功能是在redis 2.8版本以后推出的,因此你服務器上的reids最少要是2.8版本以上;
(A)業務場景:
1、當一個業務觸發以后需要啟動一個定時任務,在指定時間內再去執行一個任務(如自動取消訂單,自動完成訂單等功能)
2、redis的keyspace notifications 會在key失效后發送一個事件,監聽此事件的的客戶端就可以收到通知
(B)服務准備:
1、修改reids配置文件(redis.conf)【window系統配置文件為:redis.windows.conf 】
redis默認不會開啟keyspace notifications,因為開啟后會對cpu有消耗
備注:E:keyevent事件,事件以__keyevent@<db>__為前綴進行發布;
x:過期事件,當某個鍵過期並刪除時會產生該事件;
原配置為:
更改 配置如下:
保存配置后,重啟Redis服務,使配置生效
window系統重啟redis ,先切換到redis文件目錄,然后關閉redis服務(redis-server --service-stop),再開啟(redis-server --service-start)
C)文件代碼:
phpredis實現訂閱Keyspace notification,可實現自動取消訂單,自動完成訂單。以下為測試例子
創建4個文件,然后自行修改數據庫和redis配置參數
db.class.php
index.php
psubscribe.php
Redis2.class.php
window系統測試方法:先在cmd命令界面運行psubscribe.php,然后網頁打開index.php。
使監聽后台始終運行(訂閱)
有個問題 做到這一步,利用 phpredis 擴展,成功在代碼里實現對過期 Key 的監聽,並在 psCallback()里進行回調處理。開頭提出的兩個需求已經實現。可是這里有個問題:redis 在執行完訂閱操作后,終端進入阻塞狀態,需要一直掛在那。且此訂閱腳本需要人為在命令行執行,不符合實際需求。
實際上,我們對過期監聽回調的需求,是希望它像守護進程一樣,在后台運行,當有過期事件的消息時,觸發回調函數。使監聽后台始終運行 希望像守護進程一樣在后台一樣,
我是這樣實現的。
Linux中有一個nohup命令。功能就是不掛斷地運行命令。同時nohup把腳本程序的所有輸出,都放到當前目錄的nohup.out文件中,如果文件不可寫,則放到<用戶主目錄>/nohup.out 文件中。那么有了這個命令以后,不管我們終端窗口是否關閉,都能夠讓我們的php腳本一直運行。
編寫psubscribe.php文件:
注意:我們在開頭,申明 php 編譯器的路徑:
這是執行 php 腳本所必須的。
然后,nohup 不掛起執行 psubscribe.php,注意 末尾的 &
說明:腳本確實已經在 4456 號進程上跑起來。
查看下nohup.out cat 一下 nohuo.out,看下是否有過期輸出:
運行index.php ,3秒后效果如上即成功
遇到問題:使用命令行模式開啟監控腳本 ,一段時間后報錯 :Error while sending QUERY packet. PID=xxx
解決方法:由於等待消息隊列是一個長連接,而等待回調前有個數據庫連接,數據庫的wait_timeout=28800,所以只要下一條消息離上一條消息超過8小時,就會出現這個錯誤,把wait_timeout設置成10,並且捕獲異常,發現真實的報錯是 MySQL server has gone away ,
所以只要處理完所有業務邏輯后主動關閉數據庫連接,即數據庫連接主動close掉就可以解決問題
yii解決方法如下:
查看進程方法:
查看jobs進程ID:[ jobs -l ]命令
終止后台運行的進程方法:
清空 nohup.out文件方法:
我們在使用nohup的時候,一般都和&配合使用,但是在實際使用過程中,很多人后台掛上程序就這樣不管了,其實這樣有可能在當前賬戶非正常退出或者結束的時候,命令還是自己結束了。
所以在使用nohup命令后台運行命令之后,我們需要做以下操作:
1.先回車,退出nohup的提示。
2.然后執行exit正常退出當前賬戶。
3.然后再去鏈接終端。使得程序后台正常運行。
我們應該每次都使用exit退出,而不應該每次在nohup執行成功后直接關閉終端。這樣才能保證命令一直在后台運行。
推薦閱讀:
php+redis實現注冊、刪除、編輯、分頁、登錄、關注等功能
Laravel 下配置 Redis 讓緩存、Session 各自使用不同的 Redis 數據庫
很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那里入手去提升,對此我整理了一些資料,包括但不限於:分布式架構、高可擴展、高性能、高並發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階干貨需要的可以免費分享給大家,需要的加群(點擊→)677079770