一次php curl卡住的bug分析
生活随笔
收集整理的這篇文章主要介紹了
一次php curl卡住的bug分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
php 7.1.18 libcurl 導致curl_multi_select() 返回值永遠為-1進程卡住,升級到php 7.1.24就OK了
bug原由
用curl_multi_init加快多次請求的速度,然后再docker容器中測試發現,會卡住,cpu占用率也非常高 附上代碼
foreach ($tmp_openids as $v_openids) {$multi_ch = curl_multi_init();$ch_list = [];$succ_count = 0;$err_count = 0;foreach ($v_openids as $k => $v) {$send['content']['touser'] = $v;$post_data = json_encode($send['content'], JSON_UNESCAPED_UNICODE);$this->set_user_nick($message_detail, $user_info_lists, $v, $post_data);$ch_list[$k] = curl_init($send['api']);curl_setopt($ch_list[$k], CURLOPT_POST, 1);curl_setopt($ch_list[$k], CURLOPT_POSTFIELDS, $post_data);curl_setopt($ch_list[$k], CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch_list[$k], CURLOPT_TIMEOUT, MQ_CURLOPT_TIMEOUT);curl_setopt($ch_list[$k], CURLOPT_SSL_VERIFYPEER, false);curl_setopt($ch_list[$k], CURLOPT_SSL_VERIFYHOST, false);curl_multi_add_handle($multi_ch, $ch_list[$k]);}$active = null;do {$mrc = curl_multi_exec($multi_ch, $active); //處理在棧中的每一個句柄。無論該句柄需要讀取或寫入數據都可調用此方法。} while ($mrc == CURLM_CALL_MULTI_PERFORM);//該函數僅返回關于整個批處理棧相關的錯誤。即使返回 CURLM_OK 時單個傳輸仍可能有問題。?while ($active && $mrc == CURLM_OK) {if (curl_multi_select($multi_ch) != -1) {//阻塞直到cURL批處理連接中有活動連接。?do {$mrc = curl_multi_exec($multi_ch, $active);} while ($mrc == CURLM_CALL_MULTI_PERFORM);}}// 獲取http返回的結果foreach ($ch_list as $k => &$ch) {$result = curl_multi_getcontent($ch);curl_multi_remove_handle($multi_ch, $ch);curl_close($ch);if (!$result) {++$err_count;$this->err_log->info('微信接口無反應發送失敗!');}else {if (json_decode($result, true)['errcode'] != 0) {$this->err_log->info('微信接口報錯' . $result);++$err_count;}else {++$succ_count;}}}curl_multi_close($multi_ch); 復制代碼 與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的一次php curl卡住的bug分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2、Spring Cloud - 入门概
- 下一篇: 第三次作业-结对编程