| 订阅 | 在线投稿
分享
 
 
 

用PHP的Socket实现HTTP请求

2008-12-19 08:07:40 编辑來源:互联网 国际版 评论
 
 
  最近HTTP远程访问的程序写得多了,主要接触的是.NET类库里的WebHttpRequest类和Microsoft.XMLHTTP这个通用的对象,有了这些方便的类,我们可以通过C#,ASP,Javascript来模拟Web客户端访问其他的Web页面。但是今天想用PHP实现一下类似的功能,却一时找不到方向了,于是只能自己“丰衣足食”了。

  目前,PHP里面还没有类似于HttpRequest的类,不过在官方在线文档中找到了这么一个HttpRequest Class的页面,不过也只是提及了此功能目前可能只有在CVS版本中存在,无奈...

  要实现HTTP访问无非就是用Socket发送一个请求,然后读取返回信息。于是我就用Socket写了一个HttpRequest的类,当然也可以用fsockopen()这个函数来实现,不过两个的区别不是很大,具体代码在附件里,自己看咯。

  <?php

  /**

  * Network: HTTP request object

  * Author: Li HouYu (Karajan Lee), Shanghai, China.

  */

  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];

  }

  }

  ?>
 
 
最近HTTP远程访问的程序写得多了,主要接触的是.NET类库里的WebHttpRequest类和Microsoft.XMLHTTP这个通用的对象,有了这些方便的类,我们可以通过C#,ASP,Javascript来模拟Web客户端访问其他的Web页面。但是今天想用PHP实现一下类似的功能,却一时找不到方向了,于是只能自己“丰衣足食”了。 目前,PHP里面还没有类似于HttpRequest的类,不过在官方在线文档中找到了这么一个HttpRequest Class的页面,不过也只是提及了此功能目前可能只有在CVS版本中存在,无奈... 要实现HTTP访问无非就是用Socket发送一个请求,然后读取返回信息。于是我就用Socket写了一个HttpRequest的类,当然也可以用fsockopen()这个函数来实现,不过两个的区别不是很大,具体代码在附件里,自己看咯。 <?php /** * Network: HTTP request object * Author: Li HouYu (Karajan Lee), Shanghai, China. */ 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]; } } ?>
󰈣󰈤
日版宠物情人插曲《Winding Road》歌词

日版宠物情人2017的插曲,很带节奏感,日语的,女生唱的。 最后听见是在第8集的时候女主手割伤了,然后男主用嘴帮她吸了一下,插曲就出来了。 歌手:Def...

兄弟共妻,我成了他们夜里的美食

老钟家的两个儿子很特别,就是跟其他的人不太一样,魔一般的执着。兄弟俩都到了要结婚的年龄了,不管自家老爹怎么磨破嘴皮子,兄弟俩说不娶就不娶,老父母为兄弟两操碎了心...

网络安全治理:国家安全保障的主要方向是打击犯罪,而不是处置和惩罚受害者

来源:中国青年报 新的攻击方法不断涌现,黑客几乎永远占据网络攻击的上风,我们不可能通过技术手段杜绝网络攻击。国家安全保障的主要方向是打击犯罪,而不是处置和惩罚...

 
 
 
>>返回首页<<
 为你推荐
 
 
 
 转载本文
 UBB代码 HTML代码
复制到剪贴板...
 
 
 热帖排行
 
黑色魅力_醉人的美
梦幻蒙眬_如痴如醉
北京的“尖叫”建筑
高天上流云
 
 
王朝网络微信公众号
微信扫码关注本站公众号wangchaonetcn
 
  免责声明:本文仅代表作者个人观点,与王朝网络无关。王朝网络登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
©2005- 王朝网络 版权所有