최근에 우리는 주로 .NET 클래스 라이브러리의 WebHttpRequest 클래스와 Microsoft.XMLHTTP 공통 개체를 사용하여 C#을 통해 웹을 시뮬레이션할 수 있는 프로그램을 많이 작성했습니다. ASP 및 Javascript 클라이언트는 다른 웹 페이지에 액세스합니다. 그런데 오늘은 PHP를 이용해 비슷한 기능을 구현하고 싶었는데 한동안 방향을 못찾아서 혼자서 "음식과 의복을 충분히 준비"해야 했습니다.
현재 PHP에는 HttpRequest 클래스와 유사한 클래스가 없습니다. 그러나 공식 온라인 문서에서HttpRequest
클래스 페이지를 찾았지만 이 기능은 CVS 버전에만 존재할 수 있다고만 언급되어 있습니다.
HTTP 액세스는 소켓을 사용하여 요청을 보낸 다음 반환 정보를 읽는 것 이상입니다. 그래서 Socket을 사용하여 HttpRequest 클래스를 작성했습니다. 물론 fsockopen() 함수를 사용하여 구현할 수도 있지만 둘 사이의 차이점은 그다지 크지 않습니다.
<?php/*** 네트워크: HTTP 요청 객체* 작성자: Li HouYu(Karajan Lee), 중국 상하이.*/class HttpRequest{var $sHostAdd;var $sUri;var $iPort;var $sRequestHeader;var $sResponse ;함수 HttpRequest($sUrl){$sPatternUrlPart = '/http://([az-.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 .= 트림($sHeader)."rn";}function sendRequest($sMethod = 'GET', $sPostData = ''){$sRequest = $sMethod." ".$this->sUri ." HTTP/1.1rn";$sRequest .= $this->sRequestHeader;if ($sMethod == 'POST'){$sRequest .= "콘텐츠 유형: application/x-www-form-urlencoded rn";$sRequest .= "콘텐츠 길이: ".strlen($sPostData)."rn";$sRequest .= "rn";$sRequest .= $sPostData." rn";}$sRequest .= "rn";$sockHttp = 소켓_create(AF_INET, SOCK_STREAM, SOL_TCP);if (!$sockHttp){die('socket_create() 실패!');}$resSockHttp = 소켓_connect($sockHttp, $this->sHostAdd, $this->iPort);if (!$resSockHttp){die('socket_connect() 실패!');}socket_write($sockHttp, $sRequest, strlen($sRequest) ));$this->sResponse = '';while ($sRead = 소켓_read($sockHttp, 4096)){$this->sResponse .= $sRead;}socket_close($sockHttp);}function getResponse(){return $this->sResponse;}function getResponseBody(){$sPatternSeperate = '/rnrn/';$arMatchResponsePart = preg_split($sPatternSeperate, $this->sResponse, 2);return $arMatchResponsePart[1 ];}함수 getResponseHead(){$sPatternSeperate = '/rnrn/';$arMatchResponsePart = preg_split($sPatternSeperate, $this->sResponse, 2);return $arMatchResponsePart[0];}} ?>