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/lib
curl/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...