PHP之curl_multi并发详解办法
发布时间:09/01 来源:未知 浏览:
关键词:
PHP中curl_multi并发详解
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
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视频教程》
以上就是PHP之curl_multi并发详解办法的具体内容,更多请关注百分百源码网其它相关文章!