curl_multi 多线程批量下载非常方便。不过curl_multi有时候并发下载的数量过多就会出现CPU过高,网页假死/卡死现象。

通过查询资料测试终于找到了一个解决问题的方法。

通常我们是这样使用curl_multi的:

$connomains = array(

"http://www.lao8.org",

"http://www.163.com/",

"http://www.sina.com.cn/"

);

$mh = curl_multi_init();

foreach ($connomains as $i => $url) {

$conn[$i]=curl_init($url);

curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,1);

curl_multi_add_handle ($mh,$conn[$i]);

}

do { $n=curl_multi_exec($mh,$active); } while ($active);

foreach ($connomains as $i => $url) {

$res[$i]=curl_multi_getcontent($conn[$i]);

curl_close($conn[$i]);

}

print_r($res);

这个实例代码有个致命弱点,就是在do循环的那段,在整个url请求期间是个死循环,它会轻易导致CPU占用很高,网页出现卡死状态。

经过测试可以使用curl_multi_select()函数来解决这个问题:

方法如下:

do { $n=curl_multi_exec($mh,$active); } while ($active);

改为

do {

$mrc = curl_multi_exec($mh,$active);

} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active and $mrc == CURLM_OK) {

if (curl_multi_select($mh) != -1) {

do {

$mrc = curl_multi_exec($mh, $active);

} while ($mrc == CURLM_CALL_MULTI_PERFORM);

}

}

因为$active要等全部url数据接受完毕才变成false,所以这里用到了curl_multi_exec的返回值判断是否还有数据,当有数据的时候就不停调用curl_multi_exec,暂时没有数据就进入select阶段,新数据一来就可以被唤醒继续执行。这里的好处就是CPU的无谓消耗没有了。

另外可能遇到的问题:

控制每一个请求的超时时间,在curl_multi_add_handle之前通过curl_setopt去做:

curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);

判断是否超时了或者其他错误,在curl_multi_getcontent之前用:

curl_error($conn[$i]);

了解multi接口

当程序需要进行多次curl并发请求的时候,curl提供的multi接口就派上用场了。流畅大致是这样的:

1)、curl_multi _init初始化一个multi curl对象,为了同时进行多个curl的并发访问,我们需要初始化多个easy curl对象,使用curl_easy_setopt进行相关设置。

2)、调用curl_multi _add_handle把easy curl对象添加到multi curl对象中。

3)、添加完毕后执行curl_multi_perform方法进行并发的访问。

4)、访问结束后curl_multi_remove_handle移除相关easy curl对象,curl_easy_cleanup清除easy curl对象。

5)、最后curl_multi_cleanup清除multi curl对象。

一个简单明了的PHP使用curl_multi_add_handle并行处理实例

// 创建一对cURL资源

$ch1 = curl_init();

$ch2 = curl_init();

// 设置URL和相应的选项

curl_setopt($ch1, CURLOPT_URL, "http://www.lao8.org/");

curl_setopt($ch1, CURLOPT_HEADER, 0);

curl_setopt($ch2, CURLOPT_URL, "http://www.baidu.com/");

curl_setopt($ch2, CURLOPT_HEADER, 0);

// 创建批处理cURL句柄

$mh = curl_multi_init();

// 增加2个句柄

curl_multi_add_handle($mh,$ch1);

curl_multi_add_handle($mh,$ch2);

$running=null;

// 执行批处理句柄

do {

curl_multi_exec($mh,$running);

} while($running > 0);

// 关闭全部句柄

curl_multi_remove_handle($mh, $ch1);

curl_multi_remove_handle($mh, $ch2);

curl_multi_close($mh);

?>

同步数据太多php网页卡死_curl_multi网页假死/卡死的解决方法相关推荐

  1. 打开网页自动下载php,打开网页自动弹出下载aidclient.php窗口解决方法

    在使用浏览器打开网页的时刻,有时会自动弹出aidclient.php的下载窗口或者是aidclient.js的下载窗口,下载地址是w.cnzz.com/aidclient.php,不管是360浏览器. ...

  2. asp.net网页出现名称以无效字符开头的解决方法

    asp.net网页出现"名称以无效字符开头"的解决方法 前几天,我在学习asp.net时遇到一个问题:在使用vs2005速成版浏览开发好的网页时,在IE浏览器中直接用http:// ...

  3. 手机端网页中图片之间出现白线的解决方法

    手机端网页中图片之间出现白线的解决方法 参考文章: (1)手机端网页中图片之间出现白线的解决方法 (2)https://www.cnblogs.com/syzdidi/p/9686463.html 备 ...

  4. asp 采集不到数据,采集不成功 拒绝访问 msxml3.dll 错误 '80070005' 的解决方法

    asp 采集不到数据,采集不成功 拒绝访问 msxml3.dll 错误 '80070005' 的解决方法 用 MSXML2.ServerXMLHTTP 一定行,其他几个好像不怎么行. 另外一篇文章 采 ...

  5. java 网页提示被阻止怎么办_win7系统网页提示应用程序被JAVA安全阻止_win7系统网页提示应用程序被JAVA安全阻止解决方法-系统屋...

    在电脑通过玩意打开应用程序的时候突然被JAVA安全阻止,那么你知道win7系统打开网页提示应用程序已被JAVA安全阻止怎么办?为此系统屋为你带来一个详细的win7系统网页提示应用程序被JAVA安全阻止 ...

  6. 随笔编号-09 批量导入数据(Mysql)报MySQL server has gone away 问题的解决方法

    问题场景: 使用*.sql 脚本,批量导入数据到mysql实例中,使用DOS 界面导入的,期间,到最后一步 source D:\aaa.sql  回车后,系统提示 MySQL server has g ...

  7. MacOS下VScode安装PlatformIO Core卡死和新建项目速度慢的解决方法

    最近为了折腾smartknob,尝试vscode+platformIO,安装配置遇到了不少坑,以下是解决过程. 1. PlatformIO Installer: Installing Platform ...

  8. grafana导入json文件没有数据_XAMPP客户端环境无法导入较大Mysql数据库文件的解决方法...

    一般我们本地的网站环境是使用的PHPSTUDY软件客户端,但是一般的MacOS下会使用XAMPP客户端,以前我在MAC上也是有使用过的,总感觉没有国产的软件好用所以就没有使用. 今天遇到有网友出现XA ...

  9. 电脑网页打不开但qq能上解决方法

    2019独角兽企业重金招聘Python工程师标准>>> 问题描述: 电脑网页打不开但qq能上. 问题原因: 是由于电脑系统的DNS解析出了问题. 解决方法: 首先在键盘上同时按下   ...

  10. html body最小高度,CSS网页布局中的最小高度问题的解决方法

    假定有二个BOX,我们需要它的最小高度为150PX. CSS 复制代码代码如下: div.box1,div.box2{ width: 300px; min-height: 150px; backgro ...

最新文章

  1. pytorch移动端教程 Java调用libtorch
  2. jquery php 异步图片上传实例,php结合jquery异步上传图片(ajaxSubmit)
  3. atlas mysql 读写分离_MySQL读写分离工具Atlas
  4. Git Push 避免输入用户名和密码方法
  5. JDK源码解析之 Java.lang.Float
  6. Python计算有向图节点的入度和出度
  7. 避免内存泄露及内存的规范化使用
  8. 计算机修理工具包价格,电脑修复工具包#200多个联想工程师专用电脑修复小工具打包...
  9. 2022腾讯云学生云服务器申请攻略(25岁以下免学生认证)
  10. 迷你助手世界隐私条款
  11. 计算机cpu占用率高,CPU占用率高怎么解决?Win10系统电脑CPU占用率100%的解决方法...
  12. matlab将水印图像嵌入图像,改进的图像自嵌入水印算法及其MATLAB实现
  13. jQuery带logo的网页二维码生成
  14. Graphite系统监控
  15. 关于膨胀系数silhouette_score的metric耗时
  16. k-means(k均值聚类)算法介绍及实现(c++)
  17. python os 模块
  18. Qt5.6.3交叉编译
  19. 对MSRA-USTC 2011的 meng-meng(萌萌) 的team project的学习和评价
  20. android 飞机动画,Android Canvas打飞机之让背景动起来

热门文章

  1. 各种开源项目/库/工具介绍
  2. 人工智能知识体系的学习路线(南京大学人工智能学院本科生培养体系)
  3. 字符串hash(类似于进制的hash)
  4. 2018年3月11日论文阅读
  5. Objective--C Practice and source code
  6. Windows7 64位系统搭建Cocos2d-x 2.2.1最新版以及Android交叉编译环境(具体教程)
  7. 对Photoshop高斯模糊滤镜的算法总结
  8. 利用OpenCV3进行鱼眼镜头标定
  9. day6--pandas
  10. 地图Web服务API接口——搜索POI(以高德地图为例)