PHP para programação de sistemas: de scripts a daemons

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Quando o PHP vai além da web

\n

Imagine 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.

\n

O 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\n

Preparação: o que você precisa saber

\n

Primeiro, 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:

\n
sudo apt install php-cli php-pcntl php-posix php-sockets
\n

Verifique a disponibilidade das extensões com php -m | grep -E 'pcntl|posix|sockets'. Se estiver tudo certo, vamos em frente.

\n\n

Trabalhando com processos: fork e exec

\n

O 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.

\n
<?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?>
\n

Este 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\n

Executando comandos externos

\n

A 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.

\n
<?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?>
\n

Essa abordagem permite integrar o PHP com qualquer utilitário do sistema — desde ps até ffmpeg.

\n\n

Tratamento de sinais: tornando o daemon educado

\n

Qualquer 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

Blogs

Book Recommendations