Não é raro se deparar com situações em que você precisa enviar os resultados/saídas de um script para um local externo. Seja pelo motivo que for, você um dia vai acabar se deparando com a situação de "conversar" com uma máquina externa, local externo, etc.
E é claro que você não pode passar o resto da vida achando que o único jeito de enviar dados é via formulários ou redirecionamentos!
Se você já saiu da fase de "fazer sites" e então passou a "fazer sistemas" você certamente vai precisar uma hora ou outra, enviar os seus dados para outro local.
Existem centenas de tutoriais na internet que mostram "exemplos" de uso da função fsockopen. Porém em 90% deles, você não encontra explicações sobre para que serve cada coisa. E o material para funções mais avançadas do PHP em português é muito parco. Desta forma, vou mostrar aqui de forma mais clara o uso desta função.
Que fique claro que existem outras formas de enviar dados para locais externos, como por exemplo usando a bibliteca CURL do PHP. Porém vamos partir do princípio que você não pode recompilar o PHP, cenário que é muito comum. Além disso à partir da versão 4 do PHP, fsockopen é uma função nativa, e desta forma não necessita de dependências externas ou instalação para usá-la.
Antes de mais nada, o manual do PHP é seu amigo, portanto dê uma olhada na página da função antes de começar:
http://br.php.net/manual/pt_BR/function.fsockopen.php
O cenário que vou mostrar aqui, é real e passei por ele tempos atrás. Portanto é válido :)
Situação:
Diariamente uma loja cadastra centenas de clientes novos. Uma vez por dia, o funcionário da loja vai até a intranet local e faz o que ele chama de "sincronizar clientes" com a matriz. Uma vez que o funcionário clique no link, o script realiza um select no banco local, na tabela de clientes, selecionando apenas os que ainda não foram enviados. É aberta uma conexão TCP/IP via fsockopen com o servidor da matriz que fica no mesmo prédio mas em outro andar. Os dados são enviados para este servidor, cujo mesmo possui uma determinada página que recebe tais dados e os cadastra no banco central. Simples não?
O primeiro passo então, é realizar a conexão com o banco, e selecionar os clientes que serão enviados ao local externo.
PHP
if (!$conexao) {
}else{
$query = "SELECT nome, endereco, cidade, idade, sexo FROM clientes WHERE status_envio = 'N' ";
}
Feito isso, temos então temos selecionados os dados dos clientes ainda não sincronizados, e armazenados no array $clientes.
Agora, vamos compor ums série de dados já mastigados para serem enviados via TCP/IP. Assim será mais fácil manipulá-los na hora do envio.
PHP
$end_servidor = "192.168.1.1";
$porta_servidor = "80";
$url_servico = "/aplicacao/clientes/sincronizar.php";
Temos acima: o endereço do servidor para onde vamos enviar os dados. A porta que será utilizada na conexão e a url presente neste servidor, que receberá os dados que vamos enviar mais adiante.
Agora vamos recuperar os dados do select feito anteriormente, e montar uma URL para passá-los via GET para a $url_servico, que é a responsável por ler tais dados.
PHP
$nome_cliente = $clientes['nome'];
$endereco = $clientes['endereco'];
$cidade = $clientes['cidade'];
$idade = $clientes['idade'];
$sexo = $clientes['sexo'];
$url_a_enviar = "?acao=sincronizar&nome=$nome_cliente&endereco_cliente=$endereco&cidade=$cidade&idade=$idade&sexo=$sexo";
Desta forma, já temos a url com os dados que serão enviados. Vamos agora à parte boa da coisa, que é realmente abrir uma conexão TCP/IP e enviar tais dados!
PHP
//renomeio a varilavel a partir daqui, pra facilitar ;)
$req = $url_a_enviar;
// lembra da $url_servico criado mais acima? Aqui vai ela, no cabeçalho da conexão TCP/IP
// Isso vai informar a conexão o local que queremos conectar.
$header .= "POST $url_servico HTTP/1.0\r\n";
// Estou enviando apenas texto puro, portanto informando isso também no cabeçalho
$header .= "Content-Type: text/plain\r\n";
// Informando o tamanho dos dados da variável $req (antiga $url_a_enviar) que estou enviando
$header .=
"Content-Length: " .
strlen($req) .
"\r\n\r\n";
// abrindo uma conexão TCP/IP com fsockopen
// onde $end_servidor é o local onde vamos conectar
// $porta_servidor é a porta por onde a conexão será feita
// os demais dados são padrão da conexão e são opcionais. Se informe no manual para mais infos.
$fp =
fsockopen ($end_servidor,
80,
$errno,
$errstr,
30);
Veja que os comentários que coloquei no meio do script, te informam o que é cada coisa neste trecho das configurações do soquete de conexão. Vamos realizar o envio dos dados:
PHP
// criando um laço para enviar todos os dados até o fim do arquivo
$line =
fgets ($fp,
1024);
print $line;
// aqui só estou dando um print do resultado da conexão ;) }
Não é um bicho de sete cabeças. Uma vez enviado os dados, vamos criar o script que o recebe.
Ah, uma notinha: Todo esse trabalho de script, deve estar dentro daquele else da conexão mysql (ou seja, antes de fechar a chave da linha 9, mostrado no primeiro bloco de código. Depois não vá falar "deu erro". Leia bem o tutorial antes ;)
PHP
<?
$nome = $_REQUEST['nome'];
$endereco = $_REQUEST['endereco'];
$cidade = $_REQUEST['cidade'];
$idade = $_REQUEST['idade'];
$sexo = $_REQUEST['sexo'];
if (!$conexao) {
}else{
$query2 = "INSERT INTO tab_clientes_loja (nome, endereco, cidade, idade, sexo)
VALUES ('$nome', '$endereco', '$cidade', '$idade', '$sexo')";
}
?>
É um script simples, como você pode notar. Apenas estou resgatando os dados recebidos (como vc viu no penúltimo bloco de código do script de envio, estou enviando via POST, mas você pode enviar via GET, a escolha é sua.
Após o resgate, estou incluindo no banco. Simples assim.
Aí, no meu caso, ainda tenho um update, pra informar a loja, que estes clientes já foram sincronizados. O processo é o mesmo, mas é o inverso. Ou seja, à partir daqui, siga seu coração e bons códigos!
Boa sorte!