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;
                $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批处理连接中有活动连接。 
                        $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);
                    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) {            $mult...
1.第一种情况
在发送的时候不加上链接超时和发送超时,这样子很容易造成在发送的时候出现卡死的现象,导致线程阻塞
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 5); 
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);
2.第二种情况是加上链
				
今天项目中遇到一个问题就是在后台用curl请求数据,连续请求url链接后页面会卡死502错误,最后解决办法是在 curl请求方法中加了CURLOPT_TIMEOUT就可以了,这样如果超出设置时间不影响页面其他的请求,到了设置时间请求也会停止 curl方法如下: function get_request($url){     //初始化     $ch = curl_init();
用libcurl一段时间遇到莫名其妙的程序崩溃的情况,开会觉得是线程栈溢出导致的段错误,专门增加了线程栈的大小貌似无效。线程也是分离的。用valgrind定位到问题可能出现在curl的调用上。 排查的时候也发现了libcurl一些额外的坑,现做个总结笔记。 线程使用libcurl访问时,设置了超时时间,而libcurl库不会为这个超时信号做任何处理,信号产生而没有信号句柄处理,可能导
前两天看到有人求客户端socket发HTTP包的代码,受flw版主启发找了一些perl 的资料,不过对perl还是不太熟悉。 也没有深入的研究。无意中发现了libcurl.so这个库。去google上搜索发现它是处理客户端发送 HTTP请求的库以及 可以处理web服务器回送回来的包。研究了两天将研究的成果,共享出来给大家一起研究。 参考:http://curl.haxx...
测试大量数据时,发现取十几条数据之后,就卡顿5秒钟或10秒钟。 通过查资料设置参数之类的都没有用,后来看了官网上https://curl.haxx.se/libcurl/c/curl_easy_perform.html这句话: 我的代码里面,是调用一次post或get,就调用一次curl_easy_init(), 后来我改成把这个cu...
设置CURLOPT_LOW_SPEED_TIME、CURLOPT_LOW_SPEED_LIMIT 参数: 当传输速度小于CURLOPT_LOW_SPEED_LIMIT时(bytes/sec),curl库会根据CURLOPT_LOW_SPEED_TIME来判断是否因太慢而取消传输,从而退出阻塞。 设置 CURLOPT_CONNECTTIMEOUT 、CURLOPT_CONNEC...
PHP7.2 我在使用PHP7.2跑一段demo的时候出现提示curl_init()调用失败,未定义的问题,即Call to undefined function curl_init(),找了很久才找到解决方案,其实很简单,就是没有对应版本的curl,python初来乍到,还望见谅 在linux终端键入apt-cache search curl |grep php,得到如下: php-curl...