步骤总结如下第一步 调用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 RC CLI / FreeBSD */
$connomains = array( " " " );
$mh = curl_multi_init();
foreach ($connomains as $i = $url) {$conn[$i]=curl_init($url);curl_setopt($conn[$i] CURLOPT_RETURNTRANSFER );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占用 % 现在我们来改进它 这里要用到一个几乎没有任何文档的函数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) != ) {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);
判断是否超时了或者其phpcurl数据他错误 在curl_multi_getcontent之前用 curl_error($conn[$i]);
lishixinzhi/Article/program/PHP/201311/21124
php获取数据为什么curl获取不完整因为 , PHP CURL库默认1024字节的长度不等待数据的返回 , 所以你那段代码需增加一项配置:
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
给你一个更全面的封装方法:
function req_curl($url, $status = null, $options = array())
{
$res = '';
$options = array_merge(array(
'follow_local' = true,
'timeout' = 30,
'max_redirects' = 4,
'binary_transfer' = false,
'include_header' = false,
'no_body' = false,
'cookie_location' = dirname(__FILE__) . '/cookie',
'useragent' = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1',
'post' = array() ,
'referer' = null,
'ssl_verifypeer' = 0,
'ssl_verifyhost' = 0,
'headers' = array(
'Expect:'
) ,
'auth_name' = '',
'auth_pass' = '',
'session' = false
) , $options);
$options['url'] = $url;
$s = curl_init();
if (!$s) return false;
curl_setopt($s, CURLOPT_URL, $options['url']);
curl_setopt($s, CURLOPT_HTTPHEADER, $options['headers']);
curl_setopt($s, CURLOPT_SSL_VERIFYPEER, $options['ssl_verifypeer']);
【phpcurl数据 php curl_setopt】curl_setopt($s, CURLOPT_SSL_VERIFYHOST, $options['ssl_verifyhost']);
curl_setopt($s, CURLOPT_TIMEOUT, $options['timeout']);
curl_setopt($s, CURLOPT_MAXREDIRS, $options['max_redirects']);
curl_setopt($s, CURLOPT_RETURNTRANSFER, true);
curl_setopt($s, CURLOPT_FOLLOWLOCATION, $options['follow_local']);
推荐阅读
- ios飞行模拟类游戏,ios模拟飞行的游戏
- 户外用什么来拍摄的,尼康户外拍摄用什么模式
- 科学家的像素格斗游戏,像素科幻游戏
- 直播虚拟面具教程,虚拟主播面部捕捉软件
- shal加密java代码 java密码加密代码
- java下载报表代码,java报表怎么实现
- java低代码开发平台,低代码java开源框架
- 音响u盘怎么设置,音响如何设置u盘歌曲顺序
- 关于linux基础命令ppt的信息