Quando o PHP vai além da web
\nImagine a seguinte situação: você precisa escrever um daemon que monitore logs do sistema, faça o parsing e envie notificações para o Telegram. Ou talvez precise criar um agendador de tarefas próprio que não dependa do cron. E que tal escrever seu próprio servidor web ou proxy simples? A maioria dos desenvolvedores pensaria imediatamente em Python, Go ou C. Mas e se eu disser que o PHP também é capaz de fazer programação de sistemas? E faz isso muito bem.
\nO PHP não é apenas uma linguagem para "sites em WordPress". Sua versão CLI (Command Line Interface) é uma ferramenta completa para administração de sistemas, trabalho com processos, sockets de rede e até mesmo daemonização. Neste artigo, vamos explorar como usar PHP para programação de sistemas e mostrar exemplos reais de código que funcionam no Linux.
\n\nPreparação: o que você precisa saber
\nPrimeiro, certifique-se de ter o PHP instalado com suporte a CLI e as extensões pcntl (gerenciamento de processos), posix (chamadas de sistema) e sockets (trabalho com sockets). Na maioria das distribuições Linux, isso é feito com um único comando:
sudo apt install php-cli php-pcntl php-posix php-sockets\nVerifique a disponibilidade das extensões com php -m | grep -E 'pcntl|posix|sockets'. Se estiver tudo certo, vamos em frente.
Trabalhando com processos: fork e exec
\nO PHP permite criar processos filhos usando a função pcntl_fork(). Este é um mecanismo poderoso para execução paralela de tarefas. Veja um exemplo que inicia três processos filhos, cada um realizando seu próprio trabalho.
<?php\n$workers = 3;\n$pids = [];\n\nfor ($i = 0; $i < $workers; $i++) {\n $pid = pcntl_fork();\n if ($pid == -1) {\n die("Falha ao criar processo");\n } elseif ($pid) {\n // Processo pai: salva o PID do filho\n $pids[] = $pid;\n echo "Processo filho criado com PID: $pid\\n";\n } else {\n // Processo filho\n echo "Processo filho " . getmypid() . " iniciou o trabalho\\n";\n sleep(rand(2, 5)); // Simula trabalho\n echo "Processo filho " . getmypid() . " finalizou\\n";\n exit(0);\n }\n}\n\n// Pai aguarda a finalização de todos os processos filhos\nforeach ($pids as $pid) {\n pcntl_waitpid($pid, $status);\n echo "Processo $pid finalizou com status $status\\n";\n}\n?>\nEste código demonstra multitarefa básica em PHP. Você pode executar tarefas paralelas — parsing de logs, processamento de arquivos, requisições de rede. Na programação de sistemas, essa abordagem é essencial quando é necessário processar grandes volumes de dados sem bloquear o fluxo principal.
\n\nExecutando comandos externos
\nA função exec() e suas variações (shell_exec(), system()) permitem executar qualquer comando do sistema. Mas para programação de sistemas de verdade, é melhor usar proc_open() — ela oferece controle total sobre a entrada/saída e o PID do processo.
<?php\n$descriptorspec = [\n 0 => ["pipe", "r"], // stdin\n 1 => ["pipe", "w"], // stdout\n 2 => ["pipe", "w"] // stderr\n];\n\n$process = proc_open('ping -c 4 8.8.8.8', $descriptorspec, $pipes);\n\nif (is_resource($process)) {\n // Lê a saída\n $output = stream_get_contents($pipes[1]);\n fclose($pipes[1]);\n fclose($pipes[2]);\n proc_close($process);\n \n echo "Resultado do ping:\\n$output";\n}\n?>\nEssa abordagem permite integrar o PHP com qualquer utilitário do sistema — desde ps até ffmpeg.
Tratamento de sinais: tornando o daemon educado
\nQualquer daemon sério deve tratar corretamente os sinais do sistema operacional. O PHP, através da extensão pcntl, permite interceptar sinais (SIGTERM, SIGHUP, SIGUSR1 e outros). Esta é uma habilidade fundamental