Maison >développement back-end >tutoriel php >Explication détaillée de deux méthodes du démon PHP
Cet article présente principalement deux méthodes courantes d'implémentation du processus démon PHP. Il analyse les principes du processus démon PHP, les méthodes d'implémentation associées et les précautions de fonctionnement sous la forme d'exemples spécifiques. Les amis dans le besoin peuvent s'y référer
Les détails sont les suivants :La première façon est d'utiliser nohup et & ensemble.
Ajoutez le symbole & après la commande pour permettre au processus démarré de s'exécuter en arrière-plan sans occuper la console. La console peut également exécuter d'autres commandes. Ici, j'utilise une boucle infinie. est utilisé pour la démonstration. Le code est le suivant :<?php while(true){ echo time().PHP_EOL; sleep(3); }Utilisez la méthode & pour démarrer le processus
[root@localhost php]# php deadloop.php & [1] 3454 [root@localhost php]# ps aux | grep 3454 root 3454 0.0 0.8 284544 8452 pts/0 T 18:06 0:00 php deadloop.php root 3456 0.0 0.0 103316 896 pts/0 S+ 18:08 0:00 grep 3454 [1]+ Stopped php deadloop.php [root@localhost php]#Vous pouvez voir que le processus n'occupe pas la console, et la console peut également exécuter d'autres commandes. À ce stade, nous pouvons également utiliser la commande fg pour restaurer le processus en mode. d'occuper normalement la console.
[root@localhost php]# fg php deadloop.php 1470996682 1470996685 1470996688 1470996691Ce qui précède est une brève introduction à la commande & Regardons une autre commande nohupavant la commande Avec nohup, le processus démarré ignorera le signal de raccrochage Linux (SIGHUP). Alors dans quelles circonstances le signal SIGHUP sous Linux sera-t-il déclenché ? Le contenu suivant est tiré de l'Encyclopédie Baidu :
SIGHUP sera le suivant Il est envoyé au processus correspondant dans 3 situations :
1 Lorsque le terminal est fermé, ce signal est envoyé au premier processus de session et le processus est soumis en tant que travail. (c'est-à-dire le processus soumis avec le symbole &)2 Lorsque le premier processus de la session se termine, ce signal est envoyé à tous les processus du groupe de processus de premier plan de la session
3. quitte, le groupe de processus devient un groupe de processus orphelin, et il y a Le processus est dans un état arrêté (signal SIGSTOP ou SIGTSTP reçu), le signal sera envoyé à chaque processus du groupe de processus.
<?php declare(ticks = 1); pcntl_signal(SIGHUP, function(){ // 这地方处理信号的方式我们只是简单的写入一句日志到文件中 file_put_contents('logs.txt', 'pid : ' . posix_getpid() . ' receive SIGHUP 信号' . PHP_EOL); }); while(true){ echo time().PHP_EOL; sleep(3); }Nous n'avons pas besoin d'être si gênants, nous avons juste besoin d'utiliser la commande nohup qui nous est fournie par Linux, mais nous utilisons nohup pour démarrer le processus. Lorsque le terminal est fermé, le processus ignorera le signal SIGHUP et ne se terminera pas. Tout d'abord, supprimez le code de traitement du signal pour l'instant. Ensuite, lancez nohup.
[root@localhost php]# nohup php deadloop.phpnohup : ignorez l'entrée et ajoutez la sortie à "nohup.out" et nohup réécrira la sortie du programme en default Directement vers le fichier nohup.out dans le répertoire actuel S'il n'y a pas d'autorisation d'écriture, écrivez $homepath/nohup.out
[root@localhost php]# ls cmd.sh deadloop.php getPhoto.php nohup.out pics [root@localhost php]# tail -f nohup.out 1470999772 1470999775 1470999778 1470999781 1470999784 1470999787 1470999790 1470999793 1470999796 1470999799 1470999802Fermer à. cette fois Dans le terminal, le processus ne se termine pas, mais devient un processus orphelin (ppid=1) car le processus parent qui l'a créé s'est arrêté.
[root@localhost ~]# ps -ef | grep 3554 root 3554 3497 0 19:09 pts/0 00:00:00 php deadloop.php root 3575 3557 0 19:10 pts/1 00:00:00 grep 3554 [root@localhost ~]# ps -ef | grep 3554 root 3554 1 0 19:09 ? 00:00:00 php deadloop.php root 3577 3557 0 19:10 pts/1 00:00:00 grep 3554 [root@localhost ~]#
Conclusion : Ainsi, lorsque nous combinons les méthodes nohup et &, le processus démarré n'occupera pas la console, c'est le cas ne comptez pas sur la console. Une fois la console fermée, le processus est adopté par le processus n°1 et devient un processus orphelin. C'est très similaire au mécanisme d'un processus démon.
[root@localhost php]# nohup php deadloop.php >logs.txt 2>error.txt & [1] 3612 [root@localhost php]# ps -ef |grep 3612 root 3612 3557 0 19:18 pts/1 00:00:00 php deadloop.php root 3617 3557 0 19:19 pts/1 00:00:00 grep 3612 [root@localhost php]#Là où >logs.txt redirige la sortie standard, 2>error.txt redirige la sortie d'erreur standard. Ce qui précède est une introduction à la première méthode de mise en œuvre.
La deuxième méthode d'implémentation consiste à l'implémenter via du code selon les règles et les caractéristiques du processus démon , La plus grande caractéristique du processus démon est qu'il est séparé du terminal utilisateur et de la Session , voici le code implémenté, et les endroits clés sont commentés.
<?php $pid = pcntl_fork(); if ($pid == -1) { throw new Exception('fork子进程失败'); } elseif ($pid > 0) { //父进程退出,子进程变成孤儿进程被1号进程收养,进程脱离终端 exit(0); } // 最重要的一步,让该进程脱离之前的会话,终端,进程组的控制 posix_setsid(); // 修改当前进程的工作目录,由于子进程会继承父进程的工作目录,修改工作目录以释放对父进程工作目录的占用。 chdir('/'); /* * 通过上一步,我们创建了一个新的会话组长,进程组长,且脱离了终端,但是会话组长可以申请重新打开一个终端,为了避免 * 这种情况,我们再次创建一个子进程,并退出当前进程,这样运行的进程就不再是会话组长。 */ $pid = pcntl_fork(); if ($pid == -1) { throw new Exception('fork子进程失败'); } elseif ($pid > 0) { // 再一次退出父进程,子进程成为最终的守护进程 exit(0); } // 由于守护进程用不到标准输入输出,关闭标准输入,输出,错误输出描述符 fclose(STDIN); fclose(STDOUT); fclose(STDERR); /* * 处理业务代码 */ while(TRUE) { file_put_contents('log.txt', time().PHP_EOL, FILE_APPEND); sleep(5); }Recommandations associées :
Comment implémenter la démonisation PHP
Deux façons de processus démon en php
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!