В последнее время мы написали много программ для удаленного доступа по HTTP. В основном мы работаем с классом WebHttpRequest в библиотеке классов .NET и общим объектом Microsoft.XMLHTTP. С помощью этих удобных классов мы можем моделировать Интернет через C#. Клиенты ASP и Javascript получают доступ к другим веб-страницам. Но сегодня я хотел с помощью PHP реализовать подобную функцию, но какое-то время не мог найти направление, поэтому пришлось «запасаться едой и одеждой» самому.
В настоящее время в PHP нет класса, подобного HttpRequest. Однако я нашел такую страницу класса HttpRequest в официальной онлайн-документации, но там упоминалось только, что эта функция может существовать только в версии CVS. К сожалению...
Для реализации. HTTP-доступ — это не что иное, как отправка запроса с использованием Socket и последующее чтение возвращаемой информации. Поэтому я написал класс HttpRequest, используя Socket. Конечно, его также можно реализовать с помощью функции fsockopen(), но разница между ними не очень большая. Конкретный код приведен во вложении.
<?php/*** Сеть: объект HTTP-запроса* Автор: Ли ХоуЮ (Караян Ли), Шанхай, Китай.*/class HttpRequest{var $sHostAdd;var $sUri;var $iPort;var $sRequestHeader;var $sResponse ;function HttpRequest($sUrl){$sPatternUrlPart = '/http://([az-.0-9]+)(:(d+)){0,1}(.*)/i' ;$arMatchUrlPart = array();preg_match($sPatternUrlPart, $sUrl, $arMatchUrlPart);$this->sHostAdd = gethostbyname($arMatchUrlPart[1]);if (пусто($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)."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 .= "Content-Length: ".strlen($sPostData)."rn";$sRequest .= "rn";$sRequest .= $sPostData." rn";}$sRequest .= "rn";$sockHttp =ocket_create(AF_INET, SOCK_STREAM, SOL_TCP);if (!$sockHttp){die('socket_create() не удалось!');}$resSockHttp =ocket_connect($sockHttp, $this->sHostAdd, $this->iPort);if (!$resSockHttp){die('socket_connect() не удалось!');}socket_write($sockHttp, $sRequest, strlen($sRequest ));$this->sResponse = ''; while ($sRead =ocket_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] ];}function getResponseHead(){$sPatternSeperate = '/rnrn/';$arMatchResponsePart = preg_split($sPatternSeperate, $this->sResponse, 2);return $arMatchResponsePart[0];}} ?>