PHP是一個同步執(zhí)行的語言,簡單來說就是代碼是一行一行往下執(zhí)行的,每個請求也都是一個一個的按照順序去執(zhí)行,不像ajax那樣可以異步執(zhí)行的機制。所以再遇到了一些需要長時間執(zhí)行的程序的時候,就會造成一個結果,用戶長時間的等待,沒有結果返回,導致用戶體驗下降。類似的長時間執(zhí)行的程序例如:生成大量的PDF文件,發(fā)送大量的通知操作,處理圖片,訪問外部API等。為了不影響主程序的進行,切提高用戶體驗,減少等待時間,用異步來實現(xiàn)這些功能,絕對是一個最好的選擇,主程序繼續(xù)執(zhí)行,讓用戶完成操作,系統(tǒng)繼續(xù)執(zhí)行剩余的任務處理,例如發(fā)送通知,生成文檔。
當然,PHP有一些可以實現(xiàn)異步的插件和框架,例如Swoole、ReactPHP等,但是今天我的項目是一個,運行了很多年的系統(tǒng),且這個系統(tǒng)沒有外部網(wǎng)絡,無法聯(lián)網(wǎng)安裝插件,簡而言之就是沒法升級。
這里我想到的方法是,使用Curl來模擬異步執(zhí)行,原理就是直接用Curl請求另外一個接口去執(zhí)行想要執(zhí)行的代碼,但是我不獲取它的結果,它只需要系統(tǒng)自動執(zhí)行一邊就可以了,意思就是請求完后,直接結束請求不獲取返回結果,這樣就可以繼續(xù)執(zhí)行后面的代碼來實現(xiàn)異步。
CURLOPT_TIMEOUT 設置cURL允許執(zhí)行的最長秒數(shù)
CURLOPT_TIMEOUT_MS 設置cURL允許執(zhí)行的最長毫秒數(shù)