之前說到PHP的異步執(zhí)行,主要目的就是提升用戶體驗(yàn),減少用戶等待時(shí)間,后臺(tái)異步執(zhí)行代碼,畢竟只是簡單的模擬異步,還是很容易出問題的,所以這里改變一下思路,采用隊(duì)列來實(shí)現(xiàn),原理一樣,效果一樣,相對于模擬異步,這個(gè)更復(fù)雜一些,不如模擬異步來的簡單粗暴。
隊(duì)列,常用于解耦任務(wù)處理,例如發(fā)郵件、處理圖片、生成報(bào)告等耗時(shí)操作,避免程序長時(shí)間阻塞運(yùn)行,相對于模擬異步、使用隊(duì)列,效率更高,更可靠。
這里還是使用原生的方式去實(shí)現(xiàn)隊(duì)列的效果,先說一下隊(duì)列實(shí)現(xiàn)的流程和邏輯:包括任務(wù)創(chuàng)建、存儲(chǔ)、處理、處理結(jié)果。在程序運(yùn)行到需要處理圖片,發(fā)郵件等耗時(shí)的功能時(shí)候,創(chuàng)建隊(duì)列任務(wù),隊(duì)列的任務(wù)包括任務(wù)類型以及用到的數(shù)據(jù),存到數(shù)據(jù)庫中。這里其實(shí)也可以使用其他的存儲(chǔ)最好的應(yīng)該是使用Redis,但是我這個(gè)系統(tǒng)比較陳舊沒有安裝過,就還是用數(shù)據(jù)庫。
另外執(zhí)行一個(gè)守護(hù)進(jìn)程,或者定時(shí)器任務(wù)用來定時(shí)運(yùn)行,運(yùn)行的內(nèi)容自然就是處理數(shù)據(jù)庫中的任務(wù),這里就可以記錄一下任務(wù)的執(zhí)行狀態(tài),如果失敗的話也可以監(jiān)控到,這里就是比異步執(zhí)行好的地方,可以監(jiān)控運(yùn)行狀態(tài),記錄處理結(jié)果,控制執(zhí)行的邏輯。
1、添加任務(wù)
2、處理任務(wù)