php利用socket函数模拟发送http请求

<?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();



?>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值