Maison  >  Article  >  développement back-end  >  Explication détaillée des méthodes d'implémentation courantes du processus démon en PHP

Explication détaillée des méthodes d'implémentation courantes du processus démon en PHP

巴扎黑
巴扎黑original
2017-09-09 15:02:551620parcourir

Cet article présente principalement deux méthodes d'implémentation courantes 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 exemples de cet article décrivent deux méthodes courantes d'implémentation des démons PHP. Partagez-le avec tout le monde pour votre référence, 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'occupation ordinaire de la console.


[root@localhost php]# fg
php deadloop.php
1470996682
1470996685
1470996688
1470996691
Ce qui précède est une brève introduction à la commande &

Regardons une autre commande nohup

Ajoutez nohup avant le commande , 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 se produisent dans les trois situations suivantes. Ce qui suit est envoyé au processus correspondant :

1. Lorsque le terminal est fermé, le signal est envoyé au premier processus de session et le processus est soumis en tant que travail (qui c'est-à-dire le processus soumis avec le symbole &)

2 . Lorsque le premier processus de la session se termine, ce signal est envoyé à chaque processus du groupe de processus de premier plan de la session
3. Si le processus parent se termine, le groupe de processus devient un groupe de processus orphelin et certains processus du groupe de processus sont arrêtés (signal SIGSTOP ou SIGTSTP reçu), le signal sera envoyé à chaque processus du groupe de processus.

En combinant 1 et 2, nous savons que peu importe si le processus est démarré en & (mode travail) ou non, le signal SIGHUP sera reçu lors de la fermeture du terminal. Alors, comment le processus gérera-t-il le signal SIGHUP. ? Voir également extrait de Baidu Une phrase de l'Encyclopédie

Le traitement par défaut du système du signal SIGHUP consiste à terminer le processus qui reçoit le signal. Par conséquent, si le signal n’est pas capturé dans le programme, le processus se terminera lorsque le signal sera reçu.

C'est-à-dire que la fermeture du processus du terminal recevra le signal SIGHUP, et la méthode de traitement par défaut de ce signal est de terminer le processus. Bien sûr, nous pouvons également gérer le signal nous-mêmes, ou l'ignorer, qui est également un exemple de la boucle ci-dessus. , nous avons légèrement amélioré


<?php
declare(ticks = 1);
pcntl_signal(SIGHUP, function(){
    // 这地方处理信号的方式我们只是简单的写入一句日志到文件中
    file_put_contents(&#39;logs.txt&#39;, &#39;pid : &#39; . posix_getpid() . &#39; receive SIGHUP 信号&#39; . 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. fourni par Linux, mais lorsque nous utilisons nohup pour démarrer le processus, fermez-le. Dans le terminal, 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.php
nohup : Ignorer l'entrée et ajouter la sortie à "nohup.out"

et nohup redirigera la sortie du programme vers le courant Si le nohup Le fichier .out dans le répertoire n'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
1470999802
Fermez le terminal à ce moment et le processus ne se terminera pas. , mais est devenu 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 et ne s'appuiera pas sur la console , une fois la console fermée, le processus est adopté par le processus n°1 et devient un processus orphelin. Ceci 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.


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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn