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