Recentemente, escrevemos muitos programas para acesso remoto HTTP. Entramos em contato principalmente com a classe WebHttpRequest na biblioteca de classes .NET e com o objeto comum Microsoft.XMLHTTP. Com essas classes convenientes, podemos simular a Web por meio de C#. Clientes ASP e Javascript acessam outras páginas da Web. Mas hoje eu queria usar PHP para implementar uma função semelhante, mas não consegui encontrar a direção por um tempo, então tive que "ter comida e roupas suficientes" sozinho.
Atualmente, não existe uma classe semelhante a HttpRequest em PHP. No entanto, encontrei essa página da classe HttpRequest na documentação online oficial, mas apenas mencionou que esta função só pode existir na versão CVS
. O acesso HTTP nada mais é do que enviar uma requisição usando Socket e depois ler as informações de retorno. Então eu escrevi uma classe HttpRequest usando Socket. Claro, ela também pode ser implementada usando a função fsockopen(), mas a diferença entre as duas não é muito grande. O código específico está no anexo.
<?php
/**
* Rede: objeto de solicitação HTTP
* Autor: Li HouYu (Karajan Lee), Xangai, China.
*/
classe HttpRequest{
var $sHostAdd;
var $sUri;
var $iPort;
var $sRequestHeader;
var $sResposta;
função HttpRequest($sUrl){
$sPatternUrlPart = '/http://([az-.0-9]+)(:(d+)){0,1}(.*)/i';
$arMatchUrlPart = array();
preg_match($sPatternUrlPart, $sUrl, $arMatchUrlPart);
$this->sHostAdd = gethostbyname($arMatchUrlPart[1]);
if (vazio($arMatchUrlPart[4])){
$this->sUri = '/';
}outro{
$this->sUri = $arMatchUrlPart[4];
}
if (vazio($arMatchUrlPart[3])){
$this->iPort = 80;
}outro{
$this->iPort = $arMatchUrlPart[3];
}
$this->addRequestHeader('Host: '.$arMatchUrlPart[1]);
$this->addRequestHeader('Conexão: Fechar');
}
função 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 .= "Tipo de conteúdo: aplicativo/x-www-form-urlencodedrn";
$sRequest .= "Comprimento do conteúdo: ".strlen($sPostData)."rn";
$sRequest .= "rn";
$sRequest .= $sPostData."rn";
}
$sRequest .= "rn";
$sockHttp = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$sockHttp){
morrer('socket_create() falhou!');
}
$resSockHttp = socket_connect($sockHttp, $this->sHostAdd, $this->iPort);
if (!$resSockHttp){
morrer('socket_connect() falhou!');
}
socket_write($sockHttp, $sRequest, strlen($sRequest));
$this->sResponse = '';
while ($sRead = socket_read($sockHttp, 4096)){
$this->sResponse .= $sRead;
}
socket_close($sockHttp);
}
função getResposta(){
return $this->sResponse;
}
função getResponseBody(){
$sPatternSeperate = '/rnrn/';
$arMatchResponsePart = preg_split($sPatternSeperate, $this->sResponse, 2);
return $arMatchResponsePart[1];
}
função getResponseHead(){
$sPatternSeperate = '/rnrn/';
$arMatchResponsePart = preg_split($sPatternSeperate, $this->sResponse, 2);
retornar $arMatchResponsePart[0];
}
}
?>