一般php開發中常用的定時任務是如何實現的?例如用戶下單時間密度比較高(假如每秒都有下單),自動關閉訂單需要退款或者其他附加操作,這時使用crontab定時任務還合適嗎?沒怎麼接觸過消息隊列消息隊列可以實現嗎?

就像@浪奧布傑克特 提出的 任務是用戶自定義的,用戶在web界面進行配置,現在的系統是php寫的,任務是一個定時推送的功能,比如用戶A關注a話題,他要每天早上9點收到a話題的相關推送,用戶B關注b話題,他要每天夜裡8:00收到b話題的相關推送。 用戶對於他自己的任務可以增刪改查。 用戶的數量未知,假設有100人,如果使用crontab的話,推送工能可以用php腳本實現在命令行下執行。 問題是,用戶在web界面發起http的配置請求,後台如何修改crontab的配置文件,如果把crontab的配置文件許可權給到777,php調用本地shell去修改,但是crontab區分操作系統用戶的,不同系統用戶對應不同的配置文件,伺服器以root用戶運行,是不是每個人都要修改root的crontab的配置呢? 還有,crontab的每個任務都要帶上用戶的標識,以便用戶來查找更新他自己的任務。100個人就會有100個任務,如果用戶越來越多,crontab最多可以運行多少定時任務 作者:浪奧布傑克特 鏈接:https://www.zhihu.com/question/36359140/answer/67183039 來源:知乎 著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

若用戶量越來越大是否是每個用戶都要獨立操作crontab

我目前想到關於訂單自動關單的解決方案就是被動執行(用戶訪問相應頁面時進行訂單超時檢測) + crontab(每隔x小時進行訂單檢測定時任務),但是如果用戶需要定時推送或者其他的定時執行操作這個貌似就不是很靈光了。。

或者說php無法解決這個問題的情況下需要藉助其他框架/語言來實現嗎?


可以考慮在插入新訂單時,觸發定時清理操作.具體就是讀取上次訂單清理時間,然後跟當前系統時間對比,如果超過定時清理的時長(比如30分鐘),就執行清理操作,刪除掉訂單表中過期的訂單.

對於這些配置數據,可以保存在系統的配置表裡,比如:

conf(conf_name, conf_value)

order_last_clean_time: 1493101925 (上次訂單清理時間)

order_cron_clean_time: 30分鐘 (定時清理的時長)

order_expire_time: 30分鐘 (超過30分鐘未付款的訂單視為過期)


1. 訂單半小時未支付自動關閉等需求,用延時任務, 效率高, 只訪問資料庫一次。定時任務要不斷地去掃描是否有需要關閉的訂單。

2. 用戶定時任務, 不適合放到crontab, 管理維護太麻煩。

定時任務管理 ouqiang/gocron

延遲隊列 https://github.com/ouqiang/delay-queue

不要總想什麼解決方案都用PHP來實現

個人提供3種方案

1:任務調度服務,加入自動執行代碼來檢查訂單是否過期,如果過期取消;

2;linux計劃任務:執行php腳本執行。原理同上

3; mysql 資料庫 event 事件,每一條訂單添加一個監聽事件,如果支付完成事件取消。如果沒支付;按照約定的事件執行事件,取消訂單;


題主問題問的不具體。

基本來說,各種辦法都可以,包括題目描述中說的。

消息隊列比定時任務更好,但定時任務更簡單一些。

用redis可以簡單實現消息隊列,或用專門的軟體,在linux中有無數辦法可以實現隊列。

然後一個固定的不停止的php後台進程,去訪問消息隊列,即可。中間的處理過程都要保存在資料庫里。


就像@浪奧布傑克特 提出的
任務是用戶自定義的,用戶在web界面進行配置,現在的系統是php寫的,任務是一個定時推送的功能,比如用戶A關注a話題,他要每天早上9點收到a話題的相關推送,用戶B關注b話題,他要每天夜裡8:00收到b話題的相關推送。
用戶對於他自己的任務可以增刪改查。
用戶的數量未知,假設有100人,如果使用crontab的話,推送工能可以用php腳本實現在命令行下執行。
問題是,用戶在web界面發起http的配置請求,後台如何修改crontab的配置文件,如果把crontab的配置文件許可權給到777,php調用本地shell去修改,但是crontab區分操作系統用戶的,不同系統用戶對應不同的配置文件,伺服器以root用戶運行,是不是每個人都要修改root的crontab的配置呢?
還有,crontab的每個任務都要帶上用戶的標識,以便用戶來查找更新他自己的任務。100個人就會有100個任務,如果用戶越來越多,crontab最多可以運行多少定時任務

作者:浪奧布傑克特
鏈接:https://www.zhihu.com/question/36359140/answer/67183039
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

若用戶量越來越大是否是每個用戶都要獨立操作crontab

我目前想到關於訂單自動關單的解決方案就是被動執行(用戶訪問相應頁面時進行訂單超時檢測) + crontab(每隔x小時進行訂單檢測定時任務),但是如果用戶需要定時推送或者其他的定時執行操作這個貌似就不是很靈光了。。

或者說php無法解決這個問題的情況下需要藉助其他框架/語言來實現嗎?


linux上的話crontab,windows計劃任務,PHP實現使用計時器


推薦閱讀:
相关文章