解决php curl_multi批处理造成CPU负载过高问题

简单的cURL处理如下:

 代码如下 复制代码

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.111cn.net');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$con = curl_exec($ch);
curl_close($ch);

cURL还提供了批量处理会话,下面是cURL批量处理相关函数:
curl_multi_init — 返回一个新cURL批处理句柄
curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄
curl_multi_exec — 解析一个cURL批处理句柄
curl_multi_getcontent — 如果设置了CURLOPT_RETURNTRANSFER,则返回获取的输出的文本流
curl_multi_select — 等待所有cURL批处理中的活动连接
curl_multi_info_read — 获取当前解析的cURL的相关传输信息
curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源
curl_multi_close — 关闭一组cURL句柄

看下面使用curl multi批处理的例子:

 代码如下 复制代码
<?php
/**
 * cURL multi批量处理
 *
 * @author mckee
 * @link http://www.111cn.net
 *
 */
 
$url_array = array(
    'http://www.111cn.net/',
    'http://www.111cn.net/php/627.html',
    'http://www.111cn.net/php/258.html'
);
 
$handles = $contents = array();
 
//初始化curl multi对象
$mh = curl_multi_init();
 
//添加curl 批处理会话
foreach($url_array as $key => $url)
{
    $handles[$key] = curl_init($url);
    curl_setopt($handles[$key], CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($handles[$key], CURLOPT_TIMEOUT, 10);
   
    curl_multi_add_handle($mh, $handles[$key]);
}
 
//======================执行批处理句柄=================================
$active = null;
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){
        usleep(100);
    }
    do {
        $mrc = curl_multi_exec($mh, $active);
    } while ($mrc == CURLM_CALL_MULTI_PERFORM);
 
}
//====================================================================
 
//获取批处理内容
foreach($handles as $i => $ch)
{
    $content = curl_multi_getcontent($ch);
    $contents[$i] = curl_errno($ch) == 0 ? $content : '';
}
 
//移除批处理句柄
foreach($handles as $ch)
{
    curl_multi_remove_handle($mh, $ch);
}
 
//关闭批处理句柄
curl_multi_close($mh);
 
print_r($contents);

上面这段程序重点是执行批处理的那段,普通的处理:

 代码如下 复制代码
do { $n=curl_multi_exec($mh,$active); } while ($active);

会造成CPU Loading过高,因为$active要等全部url数据接受完毕才变成false,所以这里用到了curl_multi_exec的返回值判断是否还有数据,当有数据的时候就不停调用curl_multi_exec,没有执行数据就会sleep,如此就会避免CPU Loading 100%了。

时间: 2024-09-26 01:27:53

解决php curl_multi批处理造成CPU负载过高问题的相关文章

如何解决win10开机内存和cpu占用过高

  如何解决win10开机内存和cpu占用过高 关闭Defender防护 首选右键单击开始菜单,调出"运行"输入框(或者使用快捷键win+r),如图: 在"运行"输入框中输入"gpedit.msc",打开"组策略编辑器"如图: 在组策略编辑器中,找到"计算机配置"-"windows 组件",如图: 在"windows 组件"中找到"Windows Defen

执行计划变化导致CPU负载高的问题分析

前几天碰到一个CPU负载较高的问题.从系统层面来看,情况不是很严重,但是从应用的角度来说,已经感觉到很慢了.因为前端的调用频率还是比较高.所以会把这个问题放大. 使用top -c查看了基本的服务器信息.可以看到负载大概在30%左右.IO wait不高. top - 19:30:48 up 179 days,  4:54,  3 users,  load average: 4.43, 4.28, 4.14 Tasks: 669 total,   6 running, 661 sleeping,  

数据库性能优化分析案例---解决SQL语句过度消耗CPU问题

解决|数据|数据库|问题|性能|优化|语句 问题描述:10月25日上午滨州网通的工程师报告OSS应用系统运行缓慢,具体操作是通过OSS系统查询话单,很长时间才能返回结果,严重影响了客户的正常使用. 问题处理:1.登陆数据库主机,用sar命令看到idle的值持续为0,CPU的资源已经耗尽: bz_db1# sar 2 4 SunOS kest 5.8 Generic_108528-19 sun4u    10/26/04 10:56:46    %usr    %sys    %wio   %id

CPU占用率高的疑因总结和解决方法

  一般情况下CPU占用率高我们的电脑就会慢下来,而很多时候我们总是纳闷不知道原因何在,本文略总结它的疑因以及解决方法,再遇到这情况时我们可以通过做一点点的改动就可以解决. 首先是考虑病毒! 其次: 1.防杀毒软件造成故障 由于新版的KV.瑞星等杀毒软件加入了对网页.插件.邮件的随机监控,无疑增大了系统负担.处理方式:基本上没有合理的处理方式,尽量使用最少的监控服务吧,或者,升级你的硬件配备. 2.驱动没有经过认证,造成CPU资源占用100% 大量的测试版的驱动在网上泛滥,造成了难以发现的故障原

cpu使用率过高怎么解决

  cpu使用率过高怎么解决 CPU使用率过高是什么原因 1.电脑运行了大型的程序,例如大型的游戏,3D网络游戏等等,这种情况通常是正常的,这类程序需要较多的CPU资源,网友将大型的程序退出一段时间,CPU使用率基本上就恢复正常了; 2.电脑如果中毒,例如下载者类的病毒,这类病毒会在后台下载大量的恶意程序运行,试想一下,电脑突然运行了几十个程序,CPU使用率必然会突然飙升,用户会觉得很卡.这种情况就需要大家下载杀毒软件或者木马专杀工具进行扫描,清除完病毒.木马之后CPU使用率就会降低了; 3.C

怎么解决电脑cpu温度过高的问题

  大多数电脑用户都遇到过CPU温度过高的问题,到底CPU温度多少算正常的?今天小编就给大家整理了台式电脑与笔记本电脑CPU温度过高的解决方法,一起来看看吧! cpu 一般情况下CPU的温度在80度左右为正常温度,如果90-100的话,这温度就太高了,估计CPU本身就会出现硬件问题. 台式电脑CPU温度过高的应对策略 1.对于电脑机箱做一下简单的维护,清理一下机箱内部的灰尘,尤其是CPU,以及风扇附件的灰尘都要细心清理,然后对CPU重新涂抹硅胶. 2.给CPU的散热风扇加点润滑油,提高散热风扇的

vps上的wordpress系统的mysql的cpu占用很高怎么解决

问题描述 vps上的wordpress系统的mysql的cpu占用很高怎么解决 使用show full processlist;语句,一直显示下面的语句在运行, SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish') ORDER BY wp_posts.post_date DESC LI

vc++-如何解决数据发送线程占用cpu过高的问题?

问题描述 如何解决数据发送线程占用cpu过高的问题? 我在用MSComm控件的串口通信,要将接收到的数据发送至服务器.在创建线程后,由于线程处在一个while(1)循环中,两个线程cpu占用80%左右了,四个直接就100%,界面不动了,想将其改为非阻塞式的发送,该怎么修改?我这个最后可能还要再增加串口接收并发送数据,可能还需要更多线程,控件方式可以实现吗?请高手赐教!发送线程代码如下:DWORD WINAPI ThreadRecv3_send(LPVOID lpParameter){ CData

oracle 执行计划改变导致数据库负载过高解决办法

数据库主机负载 这里明显表现系统load 偏高,而且还在上升中:top的进程中,占用cpu都计划100% top - 16:25:39 up 123 days,  1:42,  4 users,  load average: 46.19, 45.08, 43.93 Tasks: 1469 total,  28 running, 1439 sleeping,   0 stopped,   2 zombie Cpu(s): 45.9%us,  1.1%sy,  0.0%ni, 47.1%id,  5