Conexões TCP/IP com fsockopen

Fonte: www.revistaphp.com.br


 

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.
Existem várias outras formas de enviar dados para locais externos, por exemplo usando a bibliteca CURL do PHP.Um passo importante é primeiramente ler a documentação do PHP, dê uma olhada na página da função antes de começar:


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.

$conexao = mysql_connect("host", "usuario", "senha");
if (!$conexao) {
die('Não foi possível conectar: ' . mysql_error());
}else{
mysql_select_db('minhabase');
$query = "SELECT nome, endereco, cidade, idade, sexo FROM clientes WHERE status_envio = 'N' ";
$exec = mysql_query($query,$conexao);
$clientes = mysql_fetch_array($exec);
}

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.

  1. $end_servidor = “192.168.1.1”;
  2. $porta_servidor = “80”;
  3. $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.

  1. $nome_cliente = $clientes[‘nome’];
  2. $endereco = $clientes[‘endereco’];
  3. $cidade = $clientes[‘cidade’];
  4. $idade = $clientes[‘idade’];
  5. $sexo = $clientes[‘sexo’];
  6. $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!

  1. //renomeio a varilavel a partir daqui, pra facilitar 😉
  2. $req = $url_a_enviar;
  3. // lembra da $url_servico criado mais acima? Aqui vai ela, no cabeçalho da conexão TCP/IP
  4. // Isso vai informar a conexão o local que queremos conectar.
  5. $header .= “POST $url_servico HTTP/1.0rn;
  6. // Estou enviando apenas texto puro, portanto informando isso também no cabeçalho
  7. $header .= “Content-Type: text/plainrn;
  8. // Informando o tamanho dos dados da variável $req (antiga $url_a_enviar) que estou enviando
  9. $header .= “Content-Length: “ . strlen($req) . rnrn;
  10. // abrindo uma conexão TCP/IP com fsockopen
  11. // onde $end_servidor é o local onde vamos conectar
  12. // $porta_servidor é a porta por onde a conexão será feita
  13. // os demais dados são padrão da conexão e são opcionais. Se informe no manual para mais infos.
  14. $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:

  1. // criando um laço para enviar todos os dados até o fim do arquivo
  2. while (!feof($fp)) {
  3. $line = fgets ($fp, 1024);
  4. print $line; // aqui só estou dando um print do resultado da conexão 😉
  5. }

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 😉

  1. <?
  2. $nome = $_REQUEST[‘nome’];
  3. $endereco = $_REQUEST[‘endereco’];
  4. $cidade = $_REQUEST[‘cidade’];
  5. $idade = $_REQUEST[‘idade’];
  6. $sexo = $_REQUEST[‘sexo’];
  7. $conexao = mysql_connect(“host”, “user”, “senha”);
  8. if (!$conexao) {
  9. die(‘Não foi possível conectar: ‘ . mysql_error());
  10. }else{
  11. mysql_select_db(‘central_de_clientes’);
  12. $query2 = “INSERT INTO tab_clientes_loja (nome, endereco, cidade, idade, sexo)
  13. VALUES (‘$nome’, ‘$endereco’, ‘$cidade’, ‘$idade’, ‘$sexo’)”;
  14. $exec2 = mysql_query($query2,$conexao);
  15. }
  16. ?>

É 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 caso, ainda tem um update, pra informar a loja, que estes clientes já foram sincronizados. O processo é o mesmo, contudo ao inverso.

Anúncios

Escrito por zrhans

Professor at UFSM

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s