PHP pour la programmation système : des scripts aux démons

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Quand PHP sort du cadre du web

\n

Imaginez la situation : vous devez écrire un démon qui surveille les logs système, les analyse et envoie des notifications sur Telegram. Ou peut-être devez-vous créer votre propre planificateur de tâches qui ne dépend pas de cron. Et si vous deviez écrire votre propre serveur web ou proxy simple ? La plupart des développeurs se tourneraient immédiatement vers Python, Go ou C. Mais si je vous disais que PHP sait aussi faire de la programmation système ? Et qu'il le fait plutôt bien.

\n

PHP n'est pas seulement un langage pour "les sites sous WordPress". Sa version CLI (Command Line Interface) est un outil complet pour l'administration système, la gestion des processus, les sockets réseau et même la démonisation. Dans cet article, nous allons voir comment utiliser PHP pour la programmation système et montrer des exemples de code réels qui fonctionnent sous Linux.

\n\n

Préparation : ce qu'il faut savoir

\n

Pour commencer, assurez-vous d'avoir PHP installé avec le support CLI et les extensions pcntl (gestion des processus), posix (appels système) et sockets (travail avec les sockets). Dans la plupart des distributions Linux, cela se fait avec une seule commande :

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

Vérifiez la disponibilité des extensions avec php -m | grep -E 'pcntl|posix|sockets'. Si tout est en place, c'est parti.

\n\n

Travail avec les processus : fork et exec

\n

PHP permet de créer des processus enfants avec la fonction pcntl_fork(). C'est un mécanisme puissant pour l'exécution parallèle de tâches. Voici un exemple qui lance trois processus enfants, chacun effectuant son propre travail.

\n
<?php\n$workers = 3;\n$pids = [];\n\nfor ($i = 0; $i < $workers; $i++) {\n    $pid = pcntl_fork();\n    if ($pid == -1) {\n        die("Impossible de créer le processus");\n    } elseif ($pid) {\n        // Processus parent : on sauvegarde le PID de l'enfant\n        $pids[] = $pid;\n        echo "Processus enfant créé avec PID : $pid\\n";\n    } else {\n        // Processus enfant\n        echo "Le processus enfant " . getmypid() . " a commencé son travail\\n";\n        sleep(rand(2, 5)); // Simulation de travail\n        echo "Le processus enfant " . getmypid() . " s'est terminé\\n";\n        exit(0);\n    }\n}\n\n// Le parent attend la fin de tous les processus enfants\nforeach ($pids as $pid) {\n    pcntl_waitpid($pid, $status);\n    echo "Le processus $pid s'est terminé avec le statut $status\\n";\n}\n?>
\n

Ce code illustre le multitâche de base en PHP. Vous pouvez lancer des tâches parallèles — analyse de logs, traitement de fichiers, exécution de requêtes réseau. En programmation système, cette approche est indispensable lorsqu'il faut traiter de grandes quantités de données sans bloquer le thread principal.

\n\n

Exécution de commandes externes

\n

La fonction exec() et ses variantes (shell_exec(), system()) permettent de lancer n'importe quelle commande système. Mais pour une véritable programmation système, il est préférable d'utiliser proc_open() — elle offre un contrôle total sur les entrées/sorties et le PID du processus.

\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    // Lecture de la sortie\n    $output = stream_get_contents($pipes[1]);\n    fclose($pipes[1]);\n    fclose($pipes[2]);\n    proc_close($process);\n    \n    echo "Résultat du ping :\\n$output";\n}\n?>
\n

Cette approche permet d'intégrer PHP avec n'importe quel utilitaire système — de ps à ffmpeg.

\n\n

Gestion des signaux : rendre un démon courtois

\n

Tout démon sérieux doit gérer correctement les signaux du système d'exploitation. PHP, via l'extension pcntl, permet d'intercepter les signaux (SIGTERM, SIGHUP, SIGUSR1 et autres). C'est une compétence clé

Blogs

Book Recommendations