加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

详解PHP中curl_multi并发的实现

发布时间:2020-06-17 10:57:56 所属栏目:编程 来源:站长网
导读:PHP中的curl_multi系列函数可以实现同时哀求多个URL来实现并发,而不是像平凡curl函数那样哀求后会阻塞,直到功效返回才举办下一个哀求。因此在批量哀求URL时可通过curl_multi系列函数晋升措施的运行服从。 curl平凡哀求 $startTime = microtime(true);$ch

PHP中的curl_multi系列函数可以实现同时哀求多个URL来实现并发,而不是像平凡curl函数那样哀求后会阻塞,直到功效返回才举办下一个哀求。因此在批量哀求URL时可通过curl_multi系列函数晋升措施的运行服从。

curl平凡哀求

$startTime = microtime(true); $chArr = []; $optArr = [ CURLOPT_URL => 'http://www.httpbin.org/ip', CURLOPT_HEADER => 0, CURLOPT_RETURNTRANSFER => 1, ]; $result = []; //建设多个curl资源并执行 for ($i=0; $i<10; $i++) { $chArr[$i] = curl_init(); curl_setopt_array($chArr[$i], $optArr); $result[$i] = curl_exec($chArr[$i]); curl_close($chArr[$i]); } $endTime = microtime(true); echo sprintf("use time: %.3f s".PHP_EOL, $endTime - $startTime);

use time: 6.080 s

curl_multi并发哀求

$startTime = microtime(true); $chArr = []; $optArr = [ CURLOPT_URL => 'http://www.httpbin.org/ip', CURLOPT_HEADER => 0, CURLOPT_RETURNTRANSFER => 1, ]; $result = []; //建设多个curl资源 for ($i=0; $i<10; $i++) { $chArr[$i] = curl_init(); curl_setopt_array($chArr[$i], $optArr); } //建设批处理赏罚curl句柄 $mh = curl_multi_init(); //将单个curl句柄添加到批处理赏罚curl句柄中 foreach ($chArr as $ch) { curl_multi_add_handle($mh, $ch); } //判定操纵是否仍在执行的标识的引用 $active = null; /** * 本次轮回第一次处理赏罚 $mh 批处理赏罚中的 $ch 句柄,并将 $mh 批处理赏罚的执行状态写入 $active, * 当状态值便是 CURLM_CALL_MULTI_PERFORM 时,表白数据还在写入或读取中,执行轮回, * 当第一次 $ch 句柄的数据写入或读取乐成后,状态值变为 CURLM_OK ,跳出本次轮回,进入下面的大轮回中。 */ do { //处理赏罚在批处理赏罚栈中的每一个句柄 $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); /** * 上面这段代码中,是可以直接行使 $active > 0 来作为 while 的前提,如下: * do { * $mrc = curl_multi_exec($mh, $active); * } while ($active > 0); * 此时假如整个批处理赏罚句柄没有所有执行完毕时,体系会不断的执行 curl_multi_exec 函数,从而导致体系CPU占用会很高, * 因此一样平常不回收这种方案,可以通过 curl_multi_select 函数来到达没有必要读取的措施就阻塞住的目标。 */ /** * $active 为 true 时,即 $mh 批处理赏罚之中尚有 $ch 句柄守候处理赏罚, * $mrc == CURLM_OK,即上一次 $ch 句柄的读取或写入已经执行完毕。 */ while ($active && $mrc == CURLM_OK) { /** * 措施进入阻塞状态,直到批处理赏罚中有勾当毗连(即 $mh 批处理赏罚中尚有可执行的 $ch 句柄), * 这样执行的甜头是 $mh 批处理赏罚中的 $ch 句柄会在读取或写入数据竣事后($mrc == CURLM_OK)进入阻塞阶段, * 而不会在整个 $mh 批处理赏罚执行时不断地执行 curl_multi_exec 函数,白白挥霍CPU资源。 */ if (curl_multi_select($mh) != -1) { //措施退出阻塞状态继承执行必要处理赏罚的 $ch 句柄 do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); } } foreach ($chArr as $i=>$ch) { //获取某个curl句柄的返回值 $result[$i] = curl_multi_getcontent($ch); //移除批处理赏罚句柄中的某个句柄资源 curl_multi_remove_handle($mh, $ch); } //封锁一组curl句柄 curl_multi_close($mh); $endTime = microtime(true); echo sprintf("use time: %.3f s".PHP_EOL, $endTime - $startTime);

use time: 0.599 s

通过比拟上述措施的运行时刻可以得知,行使curl_multi系列函数并发哀求要比平凡的curl函数依次哀求服从高许多。

到此这篇关于详解PHP中curl_multi并发的实现的文章就先容到这了,更多相干PHP curl_multi并发内容请搜刮剧本之家早年的文章或继承赏识下面的相干文章但愿各人往后多多支持剧本之家! 

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读