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;
Resultado da conexão via socked para o site do google

Figura 1. Resultado da conexão via socked para o site do google

Fico por aqui e bons códigos.