Cuando PHP sale del ámbito web
\nImagina esta situación: necesitas escribir un demonio que monitoree los logs del sistema, los analice y envíe notificaciones a Telegram. O quizás, crear tu propio planificador de tareas independiente de cron. ¿Y si necesitas escribir un servidor web o proxy simple? La mayoría de los desarrolladores recurrirían a Python, Go o C. Pero, ¿y si te dijera que PHP también sabe hacer programación de sistemas? Y lo hace de manera bastante competente.
\nPHP no es solo un lenguaje para "sitios en WordPress". Su versión CLI (Command Line Interface) es una herramienta completa para administración de sistemas, trabajo con procesos, sockets de red e incluso demonización. En este artículo, exploraremos cómo usar PHP para programación de sistemas y mostraremos ejemplos reales de código que funcionan en Linux.
\n\nPreparación: lo que necesitas saber
\nPrimero, asegúrate de tener PHP instalado con soporte CLI y las extensiones pcntl (gestión de procesos), posix (llamadas al sistema) y sockets (trabajo con sockets). En la mayoría de las distribuciones Linux, esto se hace con un solo comando:
sudo apt install php-cli php-pcntl php-posix php-sockets\nVerifica la disponibilidad de las extensiones con php -m | grep -E 'pcntl|posix|sockets'. Si todo está en orden, ¡comencemos!
Trabajo con procesos: fork y exec
\nPHP permite crear procesos hijos con la función pcntl_fork(). Es un mecanismo potente para ejecución paralela de tareas. Veamos un ejemplo que lanza tres procesos hijos, cada uno realizando su trabajo.
<?php\n$workers = 3;\n$pids = [];\n\nfor ($i = 0; $i < $workers; $i++) {\n $pid = pcntl_fork();\n if ($pid == -1) {\n die("No se pudo crear el proceso");\n } elseif ($pid) {\n // Proceso padre: guardamos el PID del hijo\n $pids[] = $pid;\n echo "Proceso hijo creado con PID: $pid\\n";\n } else {\n // Proceso hijo\n echo "Proceso hijo " . getmypid() . " inició su trabajo\\n";\n sleep(rand(2, 5)); // Simulación de trabajo\n echo "Proceso hijo " . getmypid() . " finalizó\\n";\n exit(0);\n }\n}\n\n// El padre espera que todos los hijos terminen\nforeach ($pids as $pid) {\n pcntl_waitpid($pid, $status);\n echo "Proceso $pid terminó con estado $status\\n";\n}\n?>\nEste código demuestra la multitarea básica en PHP. Puedes ejecutar tareas en paralelo — analizar logs, procesar archivos, hacer solicitudes de red. En programación de sistemas, este enfoque es indispensable cuando necesitas manejar grandes volúmenes de datos sin bloquear el hilo principal.
\n\nEjecución de comandos externos
\nLa función exec() y sus variantes (shell_exec(), system()) permiten ejecutar cualquier comando del sistema. Pero para programación de sistemas real, es mejor usar proc_open() — te da control total sobre la entrada/salida y el PID del proceso.
<?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 // Leemos la salida\n $output = stream_get_contents($pipes[1]);\n fclose($pipes[1]);\n fclose($pipes[2]);\n proc_close($process);\n \n echo "Resultado del ping:\\n$output";\n}\n?>\nEste enfoque permite integrar PHP con cualquier utilidad del sistema — desde ps hasta ffmpeg.
Manejo de señales: haciendo un demonio educado
\nTodo demonio serio debe manejar correctamente las señales del sistema operativo. PHP, a través de la extensión pcntl, permite interceptar señales (SIGTERM, SIGHUP, SIGUSR1 y otras). Esta es una habilidad clave