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程序设计有所帮助。