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.*/class HttpRequest{var $sHostAdd;var $sUri;var $iPort;var $sRequestHeader;var $sResponse ;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 (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('Conexão: Fechar');}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 .= "Tipo de conteúdo: aplicação/x-www-form-urlencoded rn";$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){die('socket_create() falhou!');}$resSockHttp = socket_connect($sockHttp, $this->sHostAdd, $this->iPort);if (!$resSockHttp){die('socket_connect() falhou!');}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 = '/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];}} ?>