扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
$Data = array('user' = 'xiaoming');
创新互联公司从2013年成立,先为龙川等服务建站,龙川等地企业,进行企业商务咨询服务。为龙川企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,'');
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $Data);
$a = curl_exec($ch);
curl_close($ch);
print_r( $a );
给你个我写的curl方法。
/**
* curl模拟提交
* @param string $url 网址
* @param array/string $opt 提交参数
* @param string $header 取回的头信息
* @param string $redirect 是否重定向
* @param boolean $ssl 验证https证书
* @return [type] 返回信息
*/
function curl($url, $opt='GET', $header=null, $redirect=true, $ssl=false){
//初始化
$ch = curl_init($url);
//配置设置
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $ssl);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, $ssl);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $redirect);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); #返回结果
curl_setopt($ch, CURLOPT_HEADER, true); #显示协议头
if(is_array($opt)){
//转小写
$opt = array_change_key_case($opt, CASE_LOWER);
//POST
if(isset($opt['type']) strtoupper($opt['type'])=='POST'){
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, (isset($opt['data']) ? $opt['data'] : ''));
}
//User-Agent
if(array_key_exists('ua', $opt))
curl_setopt($ch, CURLOPT_USERAGENT, $opt['ua']);
//Header
if(array_key_exists('header', $opt)){
curl_setopt($ch, CURLOPT_HTTPHEADER, (array)$opt['header']);
}
//Cookie
if(array_key_exists('cookie', $opt))
curl_setopt($ch, CURLOPT_COOKIE, $opt['cookie']);
//Referer
if(array_key_exists('referer', $opt))
curl_setopt($ch, CURLOPT_REFERER, $opt['referer']);
}else{
//仅POST
if(strtoupper((string)$opt) == 'POST')
curl_setopt($ch, CURLOPT_POST, true);
}
$result = curl_exec($ch);
if(curl_errno($ch)){
$result = curl_error($ch);
}else{
//获取头长度
$length = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
//取出头信息
$header = substr($result, 0, $length);
//去掉头信息
$result = substr($result, $length);
}
//释放
curl_close($ch);
return $result;
}
php的multi_curl功能慎用 因为某些版本的curl和php的搭配有Bug 所以你调试过没问题的代码很可能在别的机器上不正确
相信许多人对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 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);
判断是否超时了或者其他错误 在curl_multi_getcontent之前用 curl_error($conn[$i]);
lishixinzhi/Article/program/PHP/201311/21124
一、使用curl调用远程PHP文件来获取相应数据
二、问题
调用远程的PHP文件后,print_r($result)死活打印不出来东西。
三、解决
原来是自己在远程PHP文件中使用了return返回json数据,改为了echo 后就可以了
害我浪费了几个小时时间,记录一下。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流