用PHP的Socket实现HTTP请求
(2010-03-10 21:16:58)
标签:
杂谈
要实现HTTP访问无非就是用Socket发送一个请求,然后读取返回信息。当然也可以用fsockopen()这个函数来实现,不过两个的区别不是很大
class HttpRequest{
var $sHostAdd;
var $sUri;
var $iPort;
var $sRequestHeader;
var $sResponse;
function HttpRequest($sUrl){
$sPatternUrlPart =
'/http:\/\/([a-z-\.0-9]+)(:(\d+)){0,1}(.*)/i';
$arMatchUrlPart = array();
preg_match($sPatternUrlPart, $sUrl, $arMatchUrlPart);
$this->sHostAdd =
gethostbyname($arMatchUrlPart[1]);
if (empty($arMatchUrlPart[4])){
$this->sUri = '/';
}else{
$this->sUri = $arMatchUrlPart[4];
}
if (empty($arMatchUrlPart[3])){
$this->iPort = 80;
}else{
$this->iPort = $arMatchUrlPart[3];
}
$this->addRequestHeader('Host:
'.$arMatchUrlPart[1]);
$this->addRequestHeader('Connection:
Close');
}
function addRequestHeader($sHeader){
$this->sRequestHeader .=
trim($sHeader)."\r\n";
}
function sendRequest($sMethod = 'GET', $sPostData = ''){
$sRequest = $sMethod." ".$this->sUri."
HTTP/1.1\r\n";
$sRequest .= $this->sRequestHeader;
if ($sMethod == 'POST'){
$sRequest .= "Content-Type:
application/x-www-form-urlencoded\r\n";
$sRequest .= "Content-Length: ".strlen($sPostData)."\r\n";
$sRequest .= "\r\n";
$sRequest .= $sPostData."\r\n";
}
$sRequest .= "\r\n";
$sockHttp = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$sockHttp){
die('socket_create() failed!');
}
$resSockHttp = socket_connect($sockHttp,
$this->sHostAdd, $this->iPort);
if (!$resSockHttp){
die('socket_connect() failed!');
}
socket_write($sockHttp, $sRequest, strlen($sRequest));
$this->sResponse = '';
while ($sRead = socket_read($sockHttp, 4096)){
$this->sResponse .= $sRead;
}
socket_close($sockHttp);
}
function getResponse(){
return $this->sResponse;
}
function getResponseBody(){
$sPatternSeperate = '/\r\n\r\n/';
$arMatchResponsePart = preg_split($sPatternSeperate,
$this->sResponse, 2);
return $arMatchResponsePart[1];
}
function getResponseHead(){
$sPatternSeperate = '/\r\n\r\n/';
$arMatchResponsePart = preg_split($sPatternSeperate,
$this->sResponse, 2);
return $arMatchResponsePart[0];
}
}
?>
分享:
喜欢
0
赠金笔
加载中,请稍候......
评论加载中,请稍候...
发评论
登录名: 密码: 找回密码 注册记住登录状态
昵 称:
评论并转载此博文
发评论
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。