下面是一个模拟get或者post请求的方法支持
1.get,post方法
2.自定义参数
3.自定义header
4.返回服务器的返回内容和header
5.支持相特定的服务器请求url,适合测试cdn节点
代码如下
- <?php
- error_reporting(0);
- $user_agent="Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10)";
- list($rheaders,$conntent)=request_url("60.28.14.148","80","get","http://mat1.gtimg.com/www/iskin960/qqcomlogo.png",array("User-Agent"=> $user_agent),array());
- //list($rheaders,$conntent)=request_url("","","get","http://www.baidu.com/s",array("User-Agent"=>$user_agent),array("wd"=>"test"));
- if($rheaders["httpstatus"]>=200&&$rheaders["httpstatus"]<=300)
- {
- //根据返回的类型,修改header
- if($rheaders['Content-Type']!="")
- header('Content-Type: '.$rheaders['Content-Type']);
- echo $conntent;
- // foreach($rheaders as $k => $v)echo "$k: $v<br/>";
- }else
- {
- //若是是302,301之类跳转的话,继续取跳转的
- if($rheaders["httpstatus"]>=300&&$rheaders["httpstatus"]<=400){
- list($rheaders,$conntent)=request_url("","","get",$rheaders["Location"],array("User-Agent"=> $user_agent),array());
- if($rheaders["httpstatus"]>=200&&$rheaders["httpstatus"]<=300)
- {
- //根据返回的类型,修改header
- if($rheaders['Content-Type'])
- header('Content-Type: '.$rheaders['Content-Type']);
- echo $conntent;
- }
- }
- // foreach($rheaders as $k => $v)echo "$k: $v<br/>";
- }
- /*
- * 模拟get,post方法向服务器请求某url的内容,返回内容和状态码
- * 参数: $ip:url所在的服务器ip或者域名,当传入为空时,ip的默认值就是$aURL里包含host(ip或者域名)
- $port:int,url所在的服务器的端口,当传入为空时,ip的默认值就是$aURL里包含端口,若是没有的话为80
- $method:get还是post,缺省为post
- $aURL:请求的url,格式为http://username:password@hostname:port/path?arg=value#anchor
- $headers:数组,需要模拟的http头部(Referer,Content-Disposition,Expires,Cookie,Pragma,User-Agent,Accept-Language等等)
- $headers=array("Referer"=>"http://123.com","User-Agent"=>"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10)");
- $aParamsArray:数组,需要post或者get的参数
- $aParamsArray=array("id"=>123,"name"=>"abc");
- * 返回值:数组:第一个元素为返回的http头部数组(http状态(默认为0,连接错误为-1)),第二个为返回的内容
- */
- function request_url($ip,$port,$method,$aURL,$headers,$aParamsArray)
- {
- $rheaders=array();
- $rheaders["httpstatus"]=0;
- //分解URL为host,端口,和路径
- $URL=parse_url($aURL);
- if(!$port)
- {
- //缺省端口为80
- $port=($URL["port"]? $URL["port"]:80);
- }
- if(strcasecmp($method,"get")==0){
- $method="GET";
- }else{
- $method="POST";
- }
- //把post的数据放到数据段里
- foreach($aParamsArray as $key=> $value)
- {
- if($flag!=0)
- {
- $params.="&";
- $flag=1;
- }
- $params.=$key."=";
- $params.=urlencode($value);
- $flag=1;
- }
- if($method=="POST")
- {
- //获得数据段长度,放入Content-Length
- $length=strlen($params);
- }else
- {
- $length=0;
- //把数据放到url的参数后面
- $URL["query"]=$URL["query"]."&".$params;
- }
- if($URL["query"]){
- //添加参数
- $URL["path"].="?".$URL["query"].($URL["fragment"]?"#".$URL["fragment"]:"");
- }
- //创建socket连接
- $fp=fsockopen($ip==""? $URL["host"]:$ip,$port,$errno,$errstr,10);
- if(!$fp)
- {
- $rheaders["httpstatus"]=-1;
- return array($rheaders,$errstr."--->".$errno);
- }
- //去掉不多余的头部
- unset($headers['Host']);
- unset($headers['Content-Length']);
- unset($headers['Content-Type']);
- //构造post请求的头
- $header="$method ".$URL["path"]." HTTP/1.1\r\n";
- $header.="Host:".$URL["host"]."\r\n";
- foreach($headers as $k=> $v){
- $header.="$k:$v\r\n";
- }
- if(!$header["Content-Type"]){
- $header.="Content-Type:application/x-www-form-urlencoded\r\n";
- }
- $header.="Content-Length:".$length."\r\n";
- $header.="Connection:Close\r\n\r\n";
- if($method=="POST")
- {
- //添加post的字符串
- $header.=$params."\r\n";
- }
- // echo $header;
- //发送post的数据
- fputs($fp,$header);
- $inheader=1;
- $lineno=0;
- $conntent="";
- while(!feof($fp))
- {
- if($inheader){
- $line=fgets($fp,1024);//读取header
- }else{
- if($rheaders["Content-Length"]>=0){
- $line=fread($fp,$rheaders["Content-Length"]);//读取返回内容
- }else{
- $line=fread($fp,1024);//读取返回内容
- }
- }
- $lineno++;
- if($inheader){
- if($lineno==1)
- {
- //从第一行,获取返回的状态码
- if(preg_match("/^HTTP\/1\.[1|0] (\d{3})/i",$line,$match)){
- $rheaders["httpstatus"]=$match[1];
- }
- }
- //解析http头部,把所有字段
- if(preg_match("/^(.*): (.*)$/i",$line,$matches)){
- $rheaders[$matches[1]]=$matches[2];
- }
- }
- if($inheader&&($line=="\n"||$line=="\r\n")){
- $inheader=0;
- continue;
- }
- if($inheader==0)
- {
- //获得返回内容
- $conntent.=$line;
- }
- }
- fclose($fp);
- return array($rheaders,$conntent);
- }
- ?>
本文转自yifangyou 51CTO博客,原文链接:http://blog.51cto.com/yifangyou/604613,如需转载请自行联系原作者