php自定义类fsocket模拟post或get请求的方法
本文实例讲述了php自定义类fsocket模拟post或get请求的方法。分享给大家供大家参考。具体如下:
zsocket.class.php文件如下:
<?php classZSocket{ /* *Init */ privatefunction_fsockopen($host,$port,&$errno,&$errstr,$timeout){ $ip=@gethostbyname($host); $s=@socket_create(AF_INET,SOCK_STREAM,0); if(socket_set_nonblock($s)){ $r=@socket_connect($s,$ip,$port); if($r||socket_last_error()==EINPROGRESS){ $errno=EINPROGRESS; return$s; } } $errno=socket_last_error($s); $errstr=socket_strerror($errno); socket_close($s); returnfalse; } /* *设置Cookie */ privatefunction_setCookie($cookie){ $_cookies=explode(";",$cookie); $_tmp=explode("=",$_cookies[0]); setcookie($_tmp[0],$_tmp[1]); return$_cookies; } /* *获取返回数据header内容 */ privatefunction_getDataHeader(&$fp,&$reHeader,&$cookies){ $maxlen=0; while(!feof($fp)){ $line=fgets($fp,1024); if(substr($line,0,12)=='Set-Cookie:'){$cookies[]=$this->_setCookie(substr($line,12));} $reHeader.=$line; if(substr($line,0,16)=='Content-Length:'){ $maxlen=intval(substr($line,16,-2)); } if($line=="\r\n"||$line=="")break; } return$maxlen; } /* *获取返回数据正文内容 */ privatefunction_getDataBody(&$fp,$maxlen){ $reData=""; while(!feof($fp)){ $line=fgets($fp,$maxlen+1); $reData.=$line; if(strlen($line)<$maxlen)$maxlen=$maxlen-strlen($line); elsebreak; } return$reData; } /* *设置并返回要发送的header内容 */ publicfunctionget_HeaderInfo($host,$type='GET',$file='/',$params=array(),$head=array(),$cookies=array()){ $_params=$_cookies=''; if(is_array($params)){ foreach($paramsas$key=>$value){ $_params.="&".$key."=".urlencode($value); } $_params=(strlen($_params)>1)?substr($_params,1):''; }elseif(is_string($params)){ $_params=urlencode($params); } foreach($cookiesas$key=>$value){ $_cookies.=";".$key."=".urlencode($value); } $_cookies=(strlen($_cookies)>2)?substr($_cookies,2):''; $file.=($type=='GET')?($_params==''?'':'?'.$_params):''; $header=$type."".$file."HTTP/1.1\r\n"; $header.="Host:".$host."\r\n"; //$header.="Referer:".get_ip()."\r\n"; //$header.="X-Forwarded-For:".get_ip()."\r\n"; $header.=($type=='GET')?'':"Content-Type:application/x-www-form-urlencoded\r\n"; if(is_array($head)&&$head!=array()){ foreach($headas$k=>$v){ $header.=$k.":".$v."\r\n"; } } $header.="Content-Length:".strlen($_params)."\r\n"; if($_cookies!='')$header.="Cookie:".$_cookies."\r\n"; /* foreach($_SERVERas$name=>$value){ if(substr($name,0,5)=='HTTP_'&&$name!='HTTP_HOST'){ $header.=str_replace('','-',ucwords(strtolower(str_replace('_','',substr($name,5))))).":".$value."\r\n"; } } */ $header.="Connection:Close\r\n\r\n"; $header.=$_params."\r\n"; return$header; } /* *发送,并返回结果Array */ publicfunctionget_SendData($host,$port=80,$header=''){ if(function_exists('fsockopen')){ $fp=fsockopen($host,$port,$errno,$errstr,10); }elseif(function_exists('pfsockopen')){ $fp=pfsockopen($host,$port,$errno,$errstr,10); }elseif(function_exists('stream_socket_client')){ $fp=stream_socket_client($host.':'.$port,$errno,$errstr,10); }else{ $fp=$this->_fsockopen($host,$port,$errno,$errstr,10); } $fp=fsockopen($host,$port,$errno,$errstr,10); if(!$fp)returnarray('header'=>'','data'=>$errstr."--->".$errno,'cookie'=>''); $reHeader=$reData=""; $cookies=array(); fputs($fp,$header); $maxlen=$this->_getDataHeader($fp,$reHeader,$cookies); $reData=$this->_getDataBody($fp,$maxlen); fclose($fp); returnarray('header'=>$reHeader,'data'=>$reData,'cookie'=>$cookies); } }
demo代码如下:
$host='www.jb51.net'; $port='80'; $type='POST'; $file='/'; $params=''; //include_once('include/zsocket.class.php');//include $zsk=newZSocket(); $header=$zsk->get_HeaderInfo($host,$type,$file,$params); $data=$zsk->get_SendData($host,$port,$header); /* echo"<!--\r\n"; print_r($header); print_r($data); echo"-->\r\n"; */ var_dump($header); var_dump($data);
希望本文所述对大家的php程序设计有所帮助。