如題,自己本想寫(xiě)個(gè)在網(wǎng)頁(yè)里實(shí)現(xiàn)向aria2提交下載任務(wù)的功能,使用到php的curl擴(kuò)展來(lái)向aria2的rpc服務(wù)提交下載任務(wù),發(fā)現(xiàn)在aria2沒(méi)有開(kāi)啟的情況下,會(huì)出出現(xiàn)curl長(zhǎng)時(shí)間等待的情況,就會(huì)出現(xiàn)整個(gè)worker進(jìn)程被curl阻塞,無(wú)法響應(yīng)其他正常請(qǐng)求,即使設(shè)置了curl的超時(shí)時(shí)間為毫秒級(jí)也沒(méi)有用(curl_setopt($ch, CURLOPT_TIMEOUT_MS,$outtime);),大概會(huì)阻塞5秒
起初還以為是其他請(qǐng)求代碼造成了超時(shí),所以先把其他業(yè)務(wù)代碼刪除了,直接在onmessage里new aria2對(duì)象來(lái)實(shí)驗(yàn)
curl執(zhí)行curl_exec耗時(shí)記錄,超時(shí)毫秒數(shù)設(shè)置由post方法的參數(shù)傳入,執(zhí)行前記錄到t0,執(zhí)行后記錄到t1,然后輸出差值
我的post方法超時(shí)設(shè)置為200毫秒
這是官方網(wǎng)站上下載的靜態(tài)php版本執(zhí)行的情況,可以看到啟動(dòng)命令是./php,版本是8.3.12,截圖里輸出yy5.00995,就是阻塞耗時(shí)5秒,而上面post方法傳入的超時(shí)為200毫秒
這是用我系統(tǒng)的php執(zhí)行情況,可以看到啟動(dòng)命令是php,版本是8.2.6。截圖里輸出yy0.0071709,阻塞就沒(méi)有那么嚴(yán)重
這里寫(xiě)具體的系統(tǒng)環(huán)境相關(guān)信息
ubuntu
PHP的curl要設(shè)置毫秒超時(shí)的話,需要設(shè)置 curl_setopt ( $ch, CURLOPT_NOSIGNAL, true);
解決了,原來(lái)是今天修改了aria2類(lèi),修改時(shí)無(wú)意中導(dǎo)致aria2類(lèi)中的aria2RPC地址出錯(cuò)了,剛開(kāi)始按照你給出的帖子(http://www.wtbis.cn/q/11441)修改了系統(tǒng)配置,也有1秒的阻塞,顯然這個(gè)耗時(shí)也不行。最后無(wú)奈又把備份的代碼拿來(lái)試,結(jié)果老代碼沒(méi)有問(wèn)題了,就仔細(xì)從頭檢查了一下今天修改過(guò)的aria2類(lèi),一下就發(fā)現(xiàn)了是RPC地址出錯(cuò)了。不過(guò)仍然讓我困惑的就是,同樣一份代碼(指aria2RPC地址配置出錯(cuò)),靜態(tài)PHP與系統(tǒng)內(nèi)安裝的php就會(huì)有區(qū)別,從上圖可以看到系統(tǒng)內(nèi)安裝的php版本,似乎并沒(méi)有受aria2RPC地址配置出錯(cuò)的影響,依然可以做到毫秒級(jí)響應(yīng)。而靜態(tài)PHP就會(huì)受影響。
所以使用靜態(tài)版本php做curl請(qǐng)求時(shí),一定要仔細(xì)檢查請(qǐng)求地址,否則可能會(huì)導(dǎo)致整個(gè)進(jìn)程被長(zhǎng)時(shí)間阻塞
aria2的RPC地址沒(méi)有問(wèn)題的情況下請(qǐng)求耗時(shí)都是在10毫秒左右,哎,因?yàn)榇中模瑢?dǎo)致浪費(fèi)一大把時(shí)間