C/C++ libcurl CURLOPT_NOSIGNAL選項

多線程

此接口並沒有使用到SSL/TLS,但會不會是用到了signals導致的crash呢?官方建議在多線程場景下應該設置CURLOPT_NOSIGNAL選項,因爲在解析DNS出現超時的時候將會發生“糟糕”的情況。官方也給出瞭解決方法,可以使用c-ares[2]的libcurl版本實現異步域名解析來預防這種“糟糕”的情況,但是最後一句還是告誡我們:在多線程場景下,若不設置CURLOPT_NOSIGNAL選項,可能會有“意外”的情況發生。通過官方這段描述,可以大致猜測到是沒有設置這個選項造成的crash。

curl毫秒超時使用

升級後的libcurl已經支持了毫米級別的超時。但是使用的時候還有一個坑需要注意跨過去 。

libcurl如果檢查到設置的timeout < 1s 那麼會直接發出一個信號說 “已經超時了”

如果要使用毫秒超時 那麼還需要關閉這個signal功能,即設置中需要多一個

curl_setopt($ch, CURLOPT_NOSIGNAL, 1);

但是,這樣域名解析就不會受超時控制。也就是說,有可能被域名解析卡住很長時間,使用時需要注意。

然後
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200);

這樣就可以控制 超時爲 200ms了

其他的毫秒超時同理。

//以秒爲單位:
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
//以毫秒爲單位:在CURL7.16.2中被加入,從PHP5.2.3起可使用
curl_setopt($ch, CURLOPT_NOSIGNAL, true);
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章