В последнее время мы написали много программ для удаленного доступа по HTTP. В основном мы работаем с классом WebHttpRequest в библиотеке классов .NET и общим объектом Microsoft.XMLHTTP. С помощью этих удобных классов мы можем моделировать Интернет через C#. Клиенты ASP и Javascript получают доступ к другим веб-страницам. Но сегодня я хотел с помощью PHP реализовать подобную функцию, но какое-то время не мог найти направление, поэтому пришлось «запасаться едой и одеждой» самому.
В настоящее время в PHP нет класса, подобного HttpRequest. Однако я нашел такую страницу класса HttpRequest в официальной онлайн-документации, но там упоминалось только, что эта функция может существовать только в версии CVS. К сожалению...
Для реализации. HTTP-доступ — это не что иное, как отправка запроса с использованием Socket и последующее чтение возвращаемой информации. Поэтому я написал класс HttpRequest, используя Socket. Конечно, его также можно реализовать с помощью функции fsockopen(), но разница между ними не очень большая. Конкретный код приведен во вложении.
<?php
/**
* Сеть: объект HTTP-запроса.
* Автор: Ли ХоуЮ (Караян Ли), Шанхай, Китай.
*/
класс HttpRequest{
вар $sHostAdd;
вар $сури;
вар $iPort;
вар $sRequestHeader;
вар $sResponse;
функция HttpRequest($sUrl){
$sPatternUrlPart = '/http://([az-.0-9]+)(:(d+)){0,1}(.*)/i';
$arMatchUrlPart = массив();
preg_match($sPatternUrlPart, $sUrl, $arMatchUrlPart);
$this->sHostAdd = gethostbyname($arMatchUrlPart[1]);
если (пустой($arMatchUrlPart[4])){
$this->sUri = '/';
}еще{
$this->sUri = $arMatchUrlPart[4];
}
если (пустой($arMatchUrlPart[3])){
$this->iPort = 80;
}еще{
$this->iPort = $arMatchUrlPart[3];
}
$this->addRequestHeader('Хост: '.$arMatchUrlPart[1]);
$this->addRequestHeader('Соединение: Закрыть');
}
функция addRequestHeader($sHeader){
$this->sRequestHeader .= Trim($sHeader)."rn";
}
функция sendRequest($sMethod = 'GET', $sPostData = ''){
$sRequest = $sMethod." ".$this->sUri." HTTP/1.1rn";
$sRequest .= $this->sRequestHeader;
если ($sMethod == 'POST'){
$sRequest .= "Тип контента: application/x-www-form-urlencodedrn";
$sRequest .= "Content-Length: ".strlen($sPostData)."rn";
$sRequest .= "rn";
$sRequest .= $sPostData."rn";
}
$sRequest .= "rn";
$sockHttp = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
если (!$sockHttp){
die('socket_create() не удалось!');
}
$resSockHttp = socket_connect($sockHttp, $this->sHostAdd, $this->iPort);
если (!$resSockHttp){
die('socket_connect() не удалось!');
}
Socket_write($sockHttp, $sRequest, strlen($sRequest));
$this->sResponse = '';
в то время как ($sRead = socket_read($sockHttp, 4096)){
$this->sResponse .= $sRead;
}
сокет_закрыть ($ sockHttp);
}
функция getResponse(){
вернуть $this->sResponse;
}
функция getResponseBody(){
$sPatternSeperate = '/rnrn/';
$arMatchResponsePart = preg_split($sPatternSeperate, $this->sResponse, 2);
вернуть $arMatchResponsePart[1];
}
функция getResponseHead(){
$sPatternSeperate = '/rnrn/';
$arMatchResponsePart = preg_split($sPatternSeperate, $this->sResponse, 2);
вернуть $arMatchResponsePart[0];
}
}
?>