<?php
/*
* Network: HTTP request object* Author: Li HouYu (Karajan Lee), Shanghai, China.
*/
class HttpRequest{
private $sHostAdd;//服务器ip
private $sUri;//请求的文件
private $iPort;//服务器端口
private $sRequestHeader;//请求头信息
private $sResponse;//请求信息
//构造函数
function __construct($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];
}
}
$url='http://www.baidu.com';
$httpRequest=new HttpRequest($url);
$httpRequest->sendRequest();
file_put_contents('temp.txt',$httpRequest->getResponse());
echo $httpRequest->getResponseBody();
?>
php利用socket函数模拟发送http请求
最新推荐文章于 2022-12-28 05:37:38 发布