php+curlmultiinit_解析php中curl_multi的应用

相信许多人对php手册中语焉不详的curl_multi一族的函数头疼不已,它们文档少,给的例子 更是简单的让你无从借鉴,我也曾经找了许多网页,都没见一个完整的应用例子。

•curl_multi_add_handle

•curl_multi_close

•curl_multi_exec

•curl_multi_getcontent

•curl_multi_info_read

•curl_multi_init

•curl_multi_remove_handle

•curl_multi_select

一般来说,想到要用这些函数时,目的显然应该是要同时请求多个url,而不是一个一个依次请求,否则不如自己循环去调curl_exec好了。

步骤总结如下:第一步:调用curl_multi_init

第二步:循环调用curl_multi_add_handle

这一步需要注意的是,curl_multi_add_handle的第二个参数是由curl_init而来的子handle。

第三步:持续调用curl_multi_exec

第四步:根据需要循环调用curl_multi_getcontent获取结果

第五步:调用curl_multi_remove_handle,并为每个字handle调用curl_close

第六步:调用curl_multi_close

这里有一个网上找的简单例子,其作者称为dirty的例子,(稍后我会说明为何dirty):

*

Here's a quick and dirty example for curl-multi from PHP, tested on PHP 5.0.0RC1 CLI / FreeBSD 5.2.1

*/

$connomains = array(

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

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

"http://www.yahoo.com/"

);

$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占用100%。

现在我们来改进它,这里要用到一个几乎没有任何文档的函数curl_multi_select了,虽然C的curl库对select有说明,但是,php里的接口和用法确与C中有不同。

把上面do的那段改成下面这样:

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]);

注意:php的multi_curl功能慎用,因为某些版本的curl和php的搭配有Bug。所以你调试过没问题的代码很可能在别的机器上不正确。

例如今天我发现在php5.2.2搭配curl/7.16.2版本如果CURLOPT_USERAGENT属性设置成某些值,则实际发送的HTTP头的会变成一串二进制值。

而恰好这个版本的php中strip_tags函数对含二进制的数据处理的不好,这才发现了这个Bug

Python 爬虫实战:淘宝直播间实时数据抓取(弹幕分析 + 流量监控) 随着电商直播的迅猛发展,淘宝直播已成为品牌推广和商品销售的重要阵地。通过爬取淘宝直播间的实时数据,包括弹幕互动和流量信息,可以帮助商家深入了解用户行为、优化直播策略,同时为市场分析和商业决策提供数据支持。本文将深入探讨如何利用 Python 爬虫技术实现对淘宝直播间实时数据的抓取,并进行弹幕分析和流量监控。 阅读详情

相关推荐

转换变档工具_变档_spr_Bmp转换spr_天堂变档spr-bmp互相转换工具_

能够自制变档并互相转换,也可以修改别人的现成的变身spr文件

PHP多页面并发抓取curl_multi_init的运用、curl报错Failed Initialization问题及curl_multi并不是真正无阻塞异步请求

多数情况下Curl函数能满足我们大多次的请求,不过偶尔我们需要同时抓取N多个网站数据时,会发现curl这种串联抓取会用时过长,因为CURL的抓取在PHP的执行过程中是按顺序执行,也就是前面一个抓取请求未完成时,后面一个请求就会一直处于等待状态,这就浪费了很多时间。此时curl_multi_init就能派上用场了。上面的程序并不复杂,可能一般也用得比较少,比如更多的时候我们是抓取指定curl

本博客记录了从2014年以来在工作学习中遇到的技术问题、解决方法以及部分个人人生经历、经验等内容。 1013

php使用curl_init()和curl_multi_init()多线程的速度比较详解

本文实例讲述了php使用curl_init()和curl_multi_init()多线程的速度比较。分享给大家供大家参考,具体如下: phpcurl_init()的作用很大,尤其是在抓取网页内容或文件信息的时候,例如之前文章《php使用curl获取header检测开启GZip压缩》就介绍到curl_init()的强大。 curl_init()处理事物是单线程模式,如果需要对事务处理走多线程模式,那么php里提供了一个函数curl_multi_init()给我们,这就是多线程模式处理事务的函数。 curl_init()与curl_multi_init()的速度比较 curl_multi_ini

php接口优化 使用curl_multi_init批量请求

curl是一个常用的开源网络传输工具,可以通过各种协议(如HTTP、FTP、TELNET)在不同的平台上进行数据传输。PHP中的curl库允许我们利用curl功能在PHP中进行网络通信。它提供了一系列的函数,可以发送HTTP请求并获取响应。PHPcurl库是一个非常强大的工具,可以用来进行网络通信。本文中,我们介绍了如何使用curl库来同时请求多个URL地址。通过创建多个curl句柄,并使用curl_multi_close()方法执行所有请求,我们可以方便地进行并发请求。

heshihu2019的博客 2020

curl_multi_init()多线程

<?php echo date("Y-m-d H:m:s",time()); echo " "; echo floor(microtime()*1000); echo ""; $mtime = explode(" ", microtime()); $mtime = $mtime[1].($mtime[0] * 1000); $mtime2 = explode(".", $mtime); $mtim

小熊的专栏 4159

php+curlmultiinit_php使用curl_init()和curl_multi_init()多线程的速度比较详解

curl_init()处理事物是单线程模式,如果需要对事务处理走多线程模式,那么php里提供了一个函数curl_multi_init()给我们,这就是多线程模式处理事务的函数。curl_multi_init()多线程能提高网页的处理速度吗?今天我通过实验来验证一下这个问题。今天我的测试很简单,那就是要抓取www.webkaka.com网页的内容,要连续抓5次,分别用curl_init()和curl...

weixin_39593744的博客 192

php+curlmultiinit_使用 curl_multi_init 执行并发请求

使用 curl_multi_init 执行并发请求PHP 语言不像 JavaScript 那样具备异步回调的特性,实现并发也就有些棘手。不过对于服务器之间进行连接和通讯,PHP 良好支持了 libcurl 库,要执行一批并发请求,依靠 curl_multi_init 方法就可以轻松搞定。通常,一个简单的 CURL 请求是这样被组装和发送的:$ch = curl_init();curl_setopt...

weixin_39911998的博客 252

php+curlmultiinit_PHP利用CURL_MULTI实现多线程

PHP中的curl_multi一类函数可以实现同时请求多个url,而不是一个一个依次请求,这就类似一个进程实现了多个线程的功能,因此可以使用PHP利用CURL_MULTI实现完成多线程类的任务,下面就一个利用PHP CURL_MULTI多线程采集网页为例来说明一下。0102//功能:PHP利用CURL_MULTI多线程采集网页函数04print_r($text);05functionremote...

weixin_39891272的博客 354

curl_multi_init

https://www.php.net/manual/zh/function.curl-multi-init.php curl_multi: public function curlMultiPostRequestRateSearchRoom($dataArr,$header){ $curls = []; $mh = curl_multi_init(); foreach($dataArr as $key => $data){ .

脚步6978 463

php使用curl 模拟表单提交文件和数据

1、封装好的函数,传入对应的参数就可以了     //php使用curl模拟form表单提交数据     /*     *    $post_data  提交的数据数组     *      //要上传的本地文件地址"@F:/xampp/php/php.ini"上传时候,上传路径前面要有@符号     *        eg.  $furl = "@H:/htdocs/ssd.jpg

奋斗吧,CQS! 1万+

PHP多线程 curl_multi_init 的使用

php中可以通过CURL处理HTTP请求,其中curl_init()是单线程模式,如果需要对事务处理走多线程模式,那么就需要用到curl_multi_init()函数。 本案例用来测试大并发的情况下 curl_multi_init() 到底比curl_init() 快多少。 话不多少,直接上代码: <?php class Http { /** * htt...

weixin_34054866的博客 370

php+curlmultiinit_浅析php curl_multi_*系列函数进行批量http请求

何起:一系列 数量很大 数据不热 还希望被蜘蛛大量抓取的页面,在蜘蛛抓取高峰时,响应时间会被拉得很高。前人做了这样一个事儿:页面分3块,用3个内部接口提供,入口文件用curl_multi_*系列函数抓取3个内部接口的内容,拼成一个页面。怀疑这样做会有影响性能的可能。故学而分析之。看了php官方手册,总结批量调用过程如下:curl_multi_init—返回一个新cURL批处理句柄,作为curl...

weixin_39799646的博客 276

【转载+原创】curl_multi_init 简单并发下载图片问题

class BatchedCurlUtil { private $_mh; private $_timeout = 30; private $_handleArr = array(); /** * 初始化curl_multi_init */ public function __construct($url_arr) { if(!is_array($url_arr)) {

jquery007的专栏 1051

curl_multi_init函数

  参考: https://www.yuque.com/docs/share/758b3df9-d813-4249-a73d-822ad74f24fc    

冷月醉雪的博客 1314

通过系统调用分析curl_multi运行原理 PHP

curl_multi 允许你可以并发的发起请求,再来逐个处理响应数据,说简单点就是利用了NIO + select / poll 涉及到的函数 1、curl_multi_exec 原型:curl_multi_exec ( resource $mh , int &$still_running ) : int 描述:处理在栈中的每一个句柄。无论该句柄需要读取或写入数据都可调用此方法。 就这,几个人能看懂是啥意思?示例中为何总是将它放在do…while中? $mh:连接集合。 $still_running:

猛犸象 2184

PHP】多线程请求 curl_multi_init()

/** * 多线程请求 curl_multi_init() * https://www.phpied.com/simultaneuos-http-requests-in-php-with-curl/ * * $data[0]['url']='url'; * $data[0]['post']=[]; * $data[0]['post'][...

星辰大海 1323

PHP使用curl_multi实现并发请求

phpcurl_mulit系列的函数可以实现并发请求,抓取页面 各函数作用解释: curl_multi_init() 初始化一个curl批处理句柄资源。 curl_multi_add_handle() 向curl批处理会话中添加单独的curl句柄资源。curl_multi_add_handle()函数有两个参数,第一个参数表示一个curl批处理句柄资源,第二个参数表示一个单独的curl句柄...

Rust94的博客 977

php curl_multi_init,php使用curl_init()和curl_multi_init()多线程的速度比较详解

本文实例讲述了php使用curl_init()和curl_multi_init()多线程的速度比较。分享给大家供大家参考,具体如下:phpcurl_init()的作用很大,尤其是在抓取网页内容或文件信息的时候,例如之前文章《php使用curl获取header检测开启GZip压缩》就介绍到curl_init()的强大。curl_init()处理事物是单线程模式,如果需要对事务处理走多线程模式,那么...

weixin_34313315的博客 419
上一篇: 192.168.8.1手机登陆_192.168.8.1手机登陆设置上网方法
下一篇: helloworldjava_Java菜鸟学习编写第一个java程序HelloWorld
weixin_39682412
博客等级 码龄9年 20粉丝 124原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值