不依賴系統,以及不依賴yii事物機制,則考慮人為觸發。觸發可以寫在總體的公共頁面上,但是考慮到對數據庫以及WWW服務器的壓力問題,程序的延遲問題,需要對執行函數進行一些優化。
首先,我們考慮對數據庫的壓力,每次點擊頁面,我們都讓他觸發監聽系統,監聽系統首先要判斷此時是否需要更新我們的任務隊列(任務隊列我把他存在了緩存文件裡),如果不需要更新,則只需要對緩存文件裡的執行隊列進行時間正排序,對已經超時的隊列進行執行即可。但我們要考慮什麼時候更新隊列文件,以及如何更新,這樣才能減輕系統壓力。
我的思路是,首先,緩存文件可能會被人為刪除或者超時失效,則每次先檢測是否存在緩存文件(按任務/用戶/類型進行分別生成緩存),如果不存在,重新查詢數據庫,生成緩存文件(已經超時的直接執行,執行不成功的再扔進緩存隊列)。
接下來是每次訪問,如果有緩存文件,先對文件中的超時任務處理,然後更新緩存文件。此時遇到一個問題,就是操作時對緩存隊列的影響,可能我們會需要在緩存隊列的開頭或者中間的某個位置插入待執行隊列,這時我們可以手動刪除已存在的隊列就好了,下一次觸發時,由於找不到緩存文件,則會重新生成最新的緩存隊列。
當我們執行完一個任務的時候,隊列中的這個條目會刪除,如果隊列為空,則重新查詢,生成隊列,這樣就能保證最小次數的訪問數據庫。還有一個問題,比如對訂單自動確認收貨的監控,如果是用戶前台的更新,則需要同時刪除此用戶的緩存和該用戶所屬的後台管理員的緩存,這樣才能保證相關人員在浏覽這個訂單的時候,看到的都是最新的狀態。同理,後台管理員的修改訂單,也應同時刪除所有相關人員的緩存隊列。