Programação de Rede em PHP: de Sockets a WebSockets
\n\nQuando falamos de PHP, a primeira coisa que vem à mente é desenvolvimento web: processamento de formulários, geração de HTML, trabalho com bancos de dados. Mas PHP é muito mais. Você já pensou que seu script PHP pode se tornar não apenas um "respondedor" de requisições HTTP, mas um servidor completo que se comunica diretamente com outros programas, através de sockets? Isso abre as portas para um mundo de servidores de chat, lobbies de jogos, sistemas de monitoramento e dispositivos IoT.
\n\nNeste artigo, vamos tirar as viseiras e analisar a programação de rede em PHP com exemplos reais. Você aprenderá o que são sockets, como fazer o PHP escutar uma porta, como enviar e receber dados via TCP e UDP, e até mesmo tocará na magia dos WebSockets. Vamos lá!
\n\nO que é um Socket e para que serve no PHP?
\n\nUm socket é uma interface de software para troca de dados entre processos, que podem estar rodando na mesma máquina ou em computadores diferentes na rede. Imagine um telefone: você tem um número (endereço IP) e uma ramal (porta). Você pega o telefone (cria um socket), disca o número (conecta-se) e fala (transmite dados).
\n\nNo PHP, os sockets são implementados através da extensão sockets. Geralmente, ela está desabilitada por padrão, mas é fácil habilitá-la. A programação de rede em PHP permite criar:
- \n
- Servidores e clientes TCP (por exemplo, para chat ou troca de dados com outro serviço). \n
- Aplicações UDP (streaming, monitoramento, onde a perda de pacotes não é crítica). \n
- Servidores WebSocket (para aplicações em tempo real no navegador). \n
A principal vantagem é que você permanece no ambiente familiar do PHP, sem precisar migrar para C, Java ou Node.js. Claro, para sistemas de alta carga, o PHP não é ideal (devido ao single-threading), mas para protótipos, ferramentas internas ou cargas baixas, é perfeito.
\n\nCriando um Servidor TCP em PHP
\n\nVamos começar com o clássico: um servidor TCP que aceita conexões e envia uma saudação. Esta é a base de qualquer aplicação php socket.
\n\nPasso 1. Criando o Socket
\nA função socket_create() é o primeiro passo. Ela recebe três parâmetros: família de protocolos (AF_INET para IPv4), tipo de socket (SOCK_STREAM para TCP) e protocolo (0 — deixa o sistema escolher).
<?php\n// Criando um socket TCP\n$socket = socket_create(AF_INET, SOCK_STREAM, 0);\nif ($socket === false) {\n echo "Erro ao criar socket: " . socket_strerror(socket_last_error()) . "\\n";\n exit;\n}\necho "Socket criado com sucesso.\\n";\n?>\n\nPasso 2. Vinculando ao Endereço e Porta
\nUsamos socket_bind(). Vamos especificar o endereço IP (0.0.0.0 — escuta em todas as interfaces) e a porta (por exemplo, 8080).
<?php\n$address = '0.0.0.0';\n$port = 8080;\n\nif (socket_bind($socket, $address, $port) === false) {\n echo "Erro ao vincular: " . socket_strerror(socket_last_error($socket)) . "\\n";\n exit;\n}\necho "Socket vinculado a $address:$port\\n";\n?>\n\nPasso 3. Escutando Conexões de Entrada
\nColocamos o socket em modo de escuta com socket_listen(). O segundo parâmetro é o tamanho máximo da fila de conexões.
<?php\nif (socket_listen($socket, 5) === false) {\n echo "Erro ao escutar: " . socket_strerror(socket_last_error($socket)) . "\\n";\n exit;\n}\necho "Servidor iniciado, aguardando conexões...\\n";\n?>\n\nPasso 4. Aceitando um Cliente
\nA função bloqueante socket_accept(). Ela espera até que alguém se conecte e retorna um novo socket para comunicação com esse cliente.
<?php\nwhile (true) {\n $client = socket_accept($socket);\n if ($client === false) {\n echo "Erro ao aceitar conexão: " . socket_strerror(socket_last_error($socket)) . "\\n";\n break;\n }\n\n echo "Novo cliente conectado.\\n";\n\n // En