Nesse artigo vou mostrar uma função que age como proxy.
Para isso vamos usar uma função network do PHP, o fsockopen. http://www.php.net/manual/pt_BR/function.fsockopen.php
Com essa função podemos abrir uma conexão de internet com alguma página ou web service, através da maquina que está executando-a e retornar o conteúdo desse documento
O fsockopen recebe os seguintes parâmetros:
hostname - Nome do servidor para o qual você quer que o fsockopen estabelaça uma conexão. Se você compilou com suporte a OpenSSL, você pode colocar os prefixos ssl:// ou tls:// no hostname para utilizar SSL ou uma conexão cliente TLS sobre TCP/IP para conectar com o host remoto. (Ver listagem 1).
Listagem 1. Exemplo de como configurar o hostname
//CONEXÃO SEM SSL
$fp = fsockopen(“www.seusite.com.br”, port, errno, errstr, timeout);
//CONEXÃO COM SSL
$fp = fsockopen(“ssl://www.seusite.com.br”, port, errno, errstr, timeout);
port - Recebe o número da porta de acesso do site que você está tentando estabelecer a conexão. (Ver listagem 2).
Listagem 2. Exemplo de como configurar o parâmetro port
//CONEXÃO ATRAVÉS DA PORTA 80
$fp = fsockopen(hostname, 80, errno, errstr, timeout);
//CONEXÃO ATRAVÉS DA PORTA 8080
$fp = fsockopen(hostname, 8080, errno, errstr, timeout);
errno - Se informado, essa variável, guarda o número do erro que aconteceu caso não consiga estabelecer a conexão.
Se o valor retornado em errno é 0 e a função retornou FALSE, é um indicativo que o erro aconteceu antes da chamada de connect(). É bem provável que isso aconteça por um problema de inicialização de socket.
errstr - Similar ao parâmetro errno, mas retorna a mensagem de erro como string.
timeout - Timeout de conexão, em segundos.
Obs: Se você precisa de um timeout para ler/escrever dados através do socket, use stream_set_timeout(), já que o parâmetro timeout de fsockopen() somente é aplicado enquanto o socket está conectando.
Vejamos então a função para estabelecer uma conexão com uma página ou web service. (Ver listagem 3)
Listagem 3. Função para estabelecer uma conexão via socket
function getXmlHttp($hostname, $port, $timeout,
$filepath="", $getData="", $postData="",
$userAgent="", $bytes=1024){
$fp = fsockopen($hostname, $port, $errno, $errstr, $timeout);
if (!$fp) {
fclose($fp);
return "$errstr ($errno)<br />\n";
} else {
(strlen($postData)>0)? $method="POST" : $method="GET" ;
fwrite($fp, "$method $filepath$getData HTTP/1.1\r\n");
fwrite($fp, "Host: $hostname\r\n");
if(strlen($postData)>0){
fwrite($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
fwrite($fp, "Content-Length: ".strlen($postData)."\r\n");
}
if(strlen($userAgent)>0) fwrite($fp, "User-agent: $userAgent\r\n");
fwrite($fp, "Connection: close\r\n\r\n");
fwrite($fp, $postData);
$txt="";
while (!feof($fp)) {
$txt .= fgets($fp, $bytes);
}
fclose($fp);
return $txt;
}
}
Essa função aceita os parâmetros hostname, port e timeout já citados a cima e também outros parâmetros adicionais que veremos a seguir.
filepath - Nessa variável você mapeia a página que você quer acessar.
ex.: "/imagens/meme.html"
getData - Nessa variável você indica se quer enviar alguma querystring para essa página
ex.: “?id=123&nome=Gregory&bla=xpto” …
Obs.: na querystring é importante não se esquecer de colocar o ponto de interrogação no início da string.
postData - Nessa variável você indica se quer enviar algum conteúdo através do método POST. Diferentemente do parâmetro getData, não é necessário colocar o ponto de interrogação no inicio da string
userAgent - Essa váriável apesar de não ser necessária, serve para indicar para a página que você está querendo acessar se você está acessando com o navegador chrome, firefox ou ie, etc. (Ver listagem 4)
Listagem 4. Exemplos de user agent strings
//EXEMPLO DE USER AGENT STRING PARA O CHROME
$userAgent="Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.142 Safari/535.19";
//EXEMPLO DE USER AGENT STRING PARA O FIREFOX
$userAgent="Mozilla/5.0 (Windows NT 6.1; rv:11.0) Gecko/20100101 Firefox/11.0";
//EXEMPLO DE USER AGENT STRING PARA O INTERNET EXPLORER 9
$userAgent="Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)";
//EXEMPLO DE USER AGENT STRING PARA O OPERA
$userAgent="Opera/9.80 (Windows NT 6.1; U; pt-BR) Presto/2.10.229 Version/11.62";
bytes - usado na função fgets do PHP que retorna uma linha do ponteiro do arquivo. Se a maioria das linhas do arquivo for maior que 8 KB então é recomendável usar um comprimento de linha especificado por esse parâmetro bytes.
Veja na listagem 5 como usar a função e na figura 1 o resultado.
Listagem 5. Exemplo de como usar a função
$hostname="www.google.com.br";
$port=80;
$timeout=30;
$filepath="/";
$txt = getXmlHttp($hostname,$port,$timeout,$filepath);
$pos = strrpos($txt, "close\r\n\r\n")+strlen("close\r\n\r\n");
$txt = substr($txt,$pos,strlen($txt));
echo $txt;
Figura 1. Resultado da conexão via socked para o site do google
Fico por aqui e bons códigos.