在workerman里面調(diào)用curl。長時間運行(大概十幾天)curl變慢。超時、但是目標(biāo)服務(wù)器訪問正常。響應(yīng)都是毫秒級的。重啟workerman后正常。請問下是什么原因?qū)е碌?。如何解決呢
關(guān)于curl發(fā)起的http請求超時有兩個要注意:
1、連接超時
2、數(shù)據(jù)超時
這兩個超時都要設(shè)置合理的超時時間,否則可能會由于外部接口不穩(wěn)定造成長時間阻塞并較長時間占用資源描述符,最終導(dǎo)致占用大量系統(tǒng)資源而無法得到及時釋放,所以這會經(jīng)常引起運行速度緩慢或者不可預(yù)知的錯誤。
所以從這個地方試著排查下,另外當(dāng)緩慢的時候,不要重啟workerman,運行: php start.php status 看看狀態(tài)報告,一般也會有很多有價值的參考數(shù)據(jù)。
我設(shè)置了超時時間為三秒?;旧厦總€請求基本上都在三秒。有的超出的就自動斷掉了。重啟后請求都是毫秒級的。不知道是什么原因。workerman運行時間一長。curl請求時間就會變長。重啟就好了。status 命令沒有任何異常,所有進(jìn)程都是正常的
就是curl請求時間變長了。這種狀況像是目標(biāo)服務(wù)器響應(yīng)很慢的感覺。但是我看了下目標(biāo)服務(wù)器響應(yīng)是很快的。
已經(jīng)數(shù)據(jù)驗證過肯定是curl本身這個地方請求或響應(yīng)時間變慢了嗎? 另外有沒有在調(diào)用curl之前的其他上下文的地方存在阻塞代碼呢?
搞個簡單的腳本,試下是不是curl的問題。
<?php
while(1) {
$time_start = microtime(true);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
file_put_contents('/tmp/curl.log', (microtime(true)-$time_start)."\n", FILE_APPEND);
sleep(1);
}