php curl 同步 异步请求,php curl 异步并发请求http

先来看下同步的代码以及请求时间。

$start_time=date("h:i:sa");

for ($i=0; $i <100 ; $i++) {

$urls[]="http://www.downxia.com/downinfo/2315".$i.".html";

GetTitle(geturl("http://www.downxia.com/downinfo/2315".$i.".html"));

}

function geturl($url){

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$output = curl_exec($ch);

curl_close($ch);

return $output;

}

function GetTitle($output){

preg_match('/

.*/i',$output,$matches);

var_dump($matches[0]);

}

$end_time=date("h:i:sa");

echo '开始时间是:'.$start_time;

echo '结束时间是:'.$end_time;

1482f2e61248b07b88bb332237ca257f.png

最下面可以看到时间花了27秒。

接下来看下php curl 异步并发请求http的代码以及花费时间。

$start_time=date("h:i:sa");

$urls=[];

for ($i=0; $i <100 ; $i++) {

$urls[]="http://www.downxia.com/downinfo/2315".$i.".html";

}

var_dump($urls);

// GetTitle('klasjdkla

313asds12');

rolling_curl($urls,'GetTitle');

function GetTitle($output){

preg_match('/

.*/i',$output,$matches);

var_dump($matches[0]);

}

$end_time=date("h:i:sa");

echo '开始时间是:'.$start_time;

echo '结束时间是:'.$end_time;

function rolling_curl($urls, $callback, $custom_options = null)

{//多个url访问

// make sure the rolling window isn't greater than the # of urls

$rolling_window = 5;

$rolling_window = (sizeof($urls) < $rolling_window) ? sizeof($urls) : $rolling_window;

$master = curl_multi_init();

$curl_arr = array();

// add additional curl options here

$std_options = array(

CURLOPT_RETURNTRANSFER => true,

CURLOPT_FOLLOWLOCATION => true,

CURLOPT_MAXREDIRS => 5

);

$options = ($custom_options) ? ($std_options + $custom_options) : $std_options;

// start the first batch of requests

for ($i = 0; $i < $rolling_window; $i++) {

$ch = curl_init();

$options[CURLOPT_URL] = $urls[$i];

curl_setopt_array($ch, $options);

curl_multi_add_handle($master, $ch);

}

do {

while (($execrun = curl_multi_exec($master, $running)) == CURLM_CALL_MULTI_PERFORM);

if ($execrun != CURLM_OK) {

break;

}

// a request was just completed -- find out which one

while ($done = curl_multi_info_read($master)) {

$info = curl_getinfo($done['handle']);

if ($info['http_code'] == 200) {

$output = curl_multi_getcontent($done['handle']);

// request successful. process output using the callback function.

$callback($output);

// start a new request (it's important to do this before removing the old one)

$ch = curl_init();

$options[CURLOPT_URL] = $urls[$i++]; // increment i

curl_setopt_array($ch, $options);

curl_multi_add_handle($master, $ch);

// remove the curl handle that just completed

curl_multi_remove_handle($master, $done['handle']);

} else {

// request failed. add error handling.

}

}

} while ($running);

curl_multi_close($master);

return true;

}

f9a5c0dc9c5a4659e4167d7e7df08b66.png

才花了3秒?实际上我感觉应该是花了5秒,因为启动比同步要慢,开始的时候卡了2秒。

http请求效率,毋庸置疑是异步远远高于同步。

核心请求代码如下:(这是老外写的,有点小问题,最后的提示undefined offset)

function rolling_curl($urls, $callback, $custom_options = null)

{//多个url访问

// make sure the rolling window isn't greater than the # of urls

$rolling_window = 5;

$rolling_window = (sizeof($urls) < $rolling_window) ? sizeof($urls) : $rolling_window;

$master = curl_multi_init();

$curl_arr = array();

// add additional curl options here

$std_options = array(

CURLOPT_RETURNTRANSFER => true,

CURLOPT_FOLLOWLOCATION => true,

CURLOPT_MAXREDIRS => 5

);

$options = ($custom_options) ? ($std_options + $custom_options) : $std_options;

// start the first batch of requests

for ($i = 0; $i < $rolling_window; $i++) {

$ch = curl_init();

$options[CURLOPT_URL] = $urls[$i];

curl_setopt_array($ch, $options);

curl_multi_add_handle($master, $ch);

}

do {

while (($execrun = curl_multi_exec($master, $running)) == CURLM_CALL_MULTI_PERFORM);

if ($execrun != CURLM_OK) {

break;

}

// a request was just completed -- find out which one

while ($done = curl_multi_info_read($master)) {

$info = curl_getinfo($done['handle']);

if ($info['http_code'] == 200) {

$output = curl_multi_getcontent($done['handle']);

// request successful. process output using the callback function.

$callback($output);

// start a new request (it's important to do this before removing the old one)

$ch = curl_init();

$options[CURLOPT_URL] = $urls[$i++]; // increment i

curl_setopt_array($ch, $options);

curl_multi_add_handle($master, $ch);

// remove the curl handle that just completed

curl_multi_remove_handle($master, $done['handle']);

} else {

// request failed. add error handling.

}

}

} while ($running);

curl_multi_close($master);

return true;

}

修改一下。只要在新增url的时候加个判断就好了。// 当$i等于$urls数组大小时不用再增加了。

function rolling_curl($urls, $callback, $custom_options = null)

{//多个url访问

// make sure the rolling window isn't greater than the # of urls

$rolling_window = 5;

$rolling_window = (sizeof($urls) < $rolling_window) ? sizeof($urls) : $rolling_window;

$master = curl_multi_init();

$curl_arr = array();

// add additional curl options here

$std_options = array(

CURLOPT_RETURNTRANSFER => true,

CURLOPT_FOLLOWLOCATION => true,

CURLOPT_MAXREDIRS => 5

);

$options = ($custom_options) ? ($std_options + $custom_options) : $std_options;

// start the first batch of requests

for ($i = 0; $i < $rolling_window; $i++) {

$ch = curl_init();

$options[CURLOPT_URL] = $urls[$i];

curl_setopt_array($ch, $options);

curl_multi_add_handle($master, $ch);

}

do {

while (($execrun = curl_multi_exec($master, $running)) == CURLM_CALL_MULTI_PERFORM);

if ($execrun != CURLM_OK) {

break;

}

// a request was just completed -- find out which one

while ($done = curl_multi_info_read($master)) {

$info = curl_getinfo($done['handle']);

if ($info['http_code'] == 200) {

$output = curl_multi_getcontent($done['handle']);

// request successful. process output using the callback function.

$callback($output);

// start a new request (it's important to do this before removing the old one)

// 当$i等于$urls数组大小时不用再增加了

if($i

$ch = curl_init();

$options[CURLOPT_URL] = $urls[$i++]; // increment i

curl_setopt_array($ch, $options);

curl_multi_add_handle($master, $ch);

}

// remove the curl handle that just completed

curl_multi_remove_handle($master, $done['handle']);

} else {

// request failed. add error handling.

}

}

} while ($running);

curl_multi_close($master);

return true;

}

以上,结束。记录一下,以免自己忘记。需要下载Cmder的可以点这里下载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值