Processus du démon d'écriture PHP
J'ai vu une question sur segmentfault.com cet après-midi. Le titre de la question était "Comment implémenter PHP en tant que service", qui demandait si PHP. ne peut être utilisé qu'en tant que service appelé via le Web. En fait, beaucoup de gens ont des malentendus sur les scénarios d'utilisation de PHP. Ils pensent que PHP ne peut être utilisé que pour écrire des scripts web. En fait, à partir de PHP4, les scénarios d'utilisation de PHP ne se limitent plus au traitement de requêtes web. Du point de vue du système d'architecture PHP, PHP est divisé en trois niveaux : sapi, php core et zend engine. Le noyau PHP lui-même n'a aucun couplage avec le Web. PHP communique avec d'autres applications via sapi. Par exemple, mod_php est une implémentation sapi écrite pour Apache. De même, fpm est une implémentation sapi basée sur le protocole fastcgi. le serveur Web. Gère les requêtes Web. Mais il existe également de nombreux sapis qui n'ont rien à voir avec le Web. Par exemple, cli sapi peut exécuter directement php dans l'environnement de ligne de commande, et embed sapi peut intégrer php dans d'autres langages (comme Lua). Je n'ai pas l'intention de discuter ici en détail du sujet de l'architecture du système PHP et de SAPI. Je veux simplement expliquer que du point de vue de l'architecture du système, PHP a déjà été conçu pour prendre en charge divers environnements et n'est pas unique au Web. En plus de la prise en charge de l'architecture du système, les riches modules d'extension de PHP permettent également à PHP de fonctionner dans différents environnements. Par exemple, les modules pcntl et posix mentionnés dans cet article peuvent réaliser la gestion de processus de base, le traitement du signal et d'autres systèmes d'exploitation. -fonctions de niveau, et le module sockets permet à PHP d'avoir des capacités de communication par socket. Par conséquent, PHP peut être utilisé pour écrire des scripts d'outils similaires à ceux couramment utilisés par Shell ou Perl, ou même un processus démon de nature serveur. Afin de montrer comment écrire un serveur démon en PHP, j'ai écrit un simple serveur http en PHP. Ce serveur fonctionne comme un processus démon. Bien sûr, afin de me concentrer sur la façon d'utiliser PHP pour écrire des démons, je n'ai pas implémenté de logique métier spécifique pour ce serveur http, mais il peut écouter le port spécifié, accepter les requêtes http et renvoyer un texte fixe au client. l'ensemble du processus est implémenté via des sockets. Tout est écrit en php.
Exemple de code
Voici le code complet de ce programme :
<?php //Accpet the http client request and generate response content. //As a demo, this function just send "PHP HTTP Server" to client. function handle_http_request($address, $port) { $max_backlog = 16; $res_content = "HTTP/1.1 200 OK Content-Length: 15 Content-Type: text/plain; charset=UTF-8 PHP HTTP Server"; $res_len = strlen($res_content); //Create, bind and listen to socket if(($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === FALSE) { echo "Create socket failed!\n"; exit; } if((socket_bind($socket, $address, $port)) === FALSE) { echo "Bind socket failed!\n"; exit; } if((socket_listen($socket, $max_backlog)) === FALSE) { echo "Listen to socket failed!\n"; exit; } //Loop while(TRUE) { if(($accept_socket = socket_accept($socket)) === FALSE) { continue; } else { socket_write($accept_socket, $res_content, $res_len); socket_close($accept_socket); } } } //Run as daemon process. function run() { if(($pid1 = pcntl_fork()) === 0) //First child process { posix_setsid(); //Set first child process as the session leader. if(($pid2 = pcntl_fork()) === 0) //Second child process, which run as daemon. { //Replaced with your own domain or address. handle_http_request('www.codinglabs.org', 9999); } else { //First child process exit; exit; } } else { //Wait for first child process exit; pcntl_wait($status); } } //Entry point. run(); ?>
Ici, je suppose que tout le monde est familier avec la programmation dans l'environnement Unix, je ne vais donc pas l'expliquer dans trop de détails, je vais juste faire le tri. Pour faire simple, ce programme se compose principalement de deux parties. La fonction handle_http_request est chargée de traiter les requêtes http. Sa méthode d'écriture est similaire au serveur TCP écrit en C : créer un socket, lier, écouter, puis traiter chaque connexion via un. loop.Client, une fois la connexion acceptée...
Ce qui précède est l'explication détaillée de l'exemple d'écriture d'un processus démon en PHP. Pour plus de contenu connexe, veuillez prêter attention au. Site Web PHP chinois (www.php.cn) !