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

来源:互联网 发布:淘宝平台费用是多少 编辑:程序博客网 时间:2024/05/20 09:26
[php] view plaincopy
  1. <?php  
  2.   
  3. /* 
  4. * Network: HTTP request object* Author: Li HouYu (Karajan Lee), Shanghai, China. 
  5. */  
  6. class HttpRequest{  
  7.           private $sHostAdd;//服务器ip  
  8.           private $sUri;//请求的文件  
  9.           private $iPort;//服务器端口  
  10.           private $sRequestHeader;//请求头信息  
  11.           private $sResponse;//请求信息  
  12.           
  13.         //构造函数  
  14.       function __construct($sUrl){  
  15.           $sPatternUrlPart = '/http:\/\/([a-z-\.0-9]+)(:(\d+)){0,1}(.*)/i';  
  16.           $arMatchUrlPart = array();  
  17.           preg_match($sPatternUrlPart$sUrl$arMatchUrlPart);  
  18.           $this->sHostAdd = gethostbyname($arMatchUrlPart[1]);  
  19.           if (empty($arMatchUrlPart[4])){  
  20.             $this->sUri = '/';  
  21.           }else{  
  22.             $this->sUri = $arMatchUrlPart[4];  
  23.           }  
  24.           if (empty($arMatchUrlPart[3])){  
  25.             $this->iPort = 80;  
  26.           }else{  
  27.             $this->iPort = $arMatchUrlPart[3];  
  28.           }  
  29.           $this->addRequestHeader('Host: '.$arMatchUrlPart[1]);  
  30.           $this->addRequestHeader('Connection: Close');  
  31.       }  
  32.         
  33.         
  34.       //添加头信息  
  35.       function addRequestHeader($sHeader){  
  36.          $this->sRequestHeader .= trim($sHeader)."\r\n";  
  37.       }  
  38.         
  39.       //发送请求  
  40.       function sendRequest($sMethod = 'GET'$sPostData = ''){  
  41.           $sRequest = $sMethod." ".$this->sUri." HTTP/1.1\r\n";  
  42.           $sRequest .= $this->sRequestHeader;  
  43.           if ($sMethod == 'POST'){  
  44.               $sRequest .= "Content-Type: application/x-www-form-urlencoded\r\n";  
  45.               $sRequest .= "Content-Length: ".strlen($sPostData)."\r\n";  
  46.               $sRequest .= "\r\n";  
  47.               $sRequest .= $sPostData."\r\n";  
  48.           }  
  49.           $sRequest .= "\r\n";  
  50.           $sockHttp = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);  
  51.           if (!$sockHttp){  
  52.             die('socket_create() failed!');  
  53.           }  
  54.           $resSockHttp = socket_connect($sockHttp$this->sHostAdd, $this->iPort);  
  55.           if (!$resSockHttp){  
  56.             die('socket_connect() failed!');  
  57.           }  
  58.           socket_write($sockHttp$sRequeststrlen($sRequest));  
  59.           $this->sResponse = '';  
  60.           while ($sRead = socket_read($sockHttp, 4096)){  
  61.             $this->sResponse .= $sRead;  
  62.           }  
  63.           socket_close($sockHttp);  
  64.       }  
  65.         
  66.       //获取响应  
  67.       function getResponse(){  
  68.         return $this->sResponse;  
  69.       }  
  70.         
  71.       //获取响应正文  
  72.       function getResponseBody(){  
  73.           $sPatternSeperate = '/\r\n\r\n/';  
  74.           $arMatchResponsePart = preg_split($sPatternSeperate$this->sResponse, 2);  
  75.           return $arMatchResponsePart[1];  
  76.       }  
  77.         
  78.       //获取响应头  
  79.       function getResponseHead(){  
  80.           $sPatternSeperate = '/\r\n\r\n/';  
  81.           $arMatchResponsePart = preg_split($sPatternSeperate$this->sResponse, 2);  
  82.           return $arMatchResponsePart[0];  
  83.       }  
  84. }  
  85.   
  86.   
  87. $url='http://www.baidu.com';  
  88. $httpRequest=new HttpRequest($url);  
  89. $httpRequest->sendRequest();  
  90. file_put_contents('temp.txt',$httpRequest->getResponse());  
  91. echo $httpRequest->getResponseBody();  
  92.   
  93.   
  94.   
  95. ?>  
0 0