Maison > Article > développement back-end > Exemples d'implémentation de processus démons dans les environnements C et PHP
Un démon est généralement considéré comme une tâche en arrière-plan qui ne contrôle pas le terminal. Cet article présente principalement la méthode et le principe du processus d'implémentation du processus démon PHP dans l'environnement C et l'environnement PHP. J'espère qu'il sera utile à tout le monde de comprendre le processus démon en PHP.
Qu'est-ce qu'un démon ?
Un démon est généralement considéré comme une tâche en arrière-plan qui ne contrôle pas le terminal. Il présente trois caractéristiques distinctives : il s'exécute en arrière-plan, est séparé du processus qui l'a lancé et n'a pas besoin de contrôler le terminal. La méthode d'implémentation couramment utilisée est fork() -> setsid() -> fork()
Il existe un démon de fonction dans la glibc. L'appel de cette fonction peut amener le processus actuel à quitter le terminal et à devenir un processus démon. Pour plus de détails, voir man daemon. Il n'existe actuellement aucune fonction de ce type en PHP. Il existe deux manières d'implémenter la démonisation des programmes PHP :
1. Utilisez la commande système nohup
nohup php myprog.php > log.txt Bien que le programme exécuté s'exécute également en arrière-plan, cela dépend en fait du terminal. Lorsque l'utilisateur quitte le terminal, le processus le fera. être tué. Vous devez utiliser nohup pour atteindre
2. Utiliser l'outil superviseur (solution recommandée)
Tutoriel détaillé sur l'utilisation du superviseur
3. Bien entendu, il peut également être implémenté par programme (non recommandé pour une utilisation dans les environnements de production) Implémentation du programme C :
#include#include#include#include#include#include//实现守护进程步骤 void crete_daemon(void) { pid_t pid = 0; pid = fork(); if (pid<0) { perror("fork"); exit(-1); } if (pid > 0) { //1.父进程直接退出 exit(0); } //2. //执行到这里就是子进程 //setsid 将当前进程设置为一个新的会话期session,目的就是 //让当前进程脱离控制台,成为守护进程。 pid = setsid(); if (pid < 0) { perror("setsid"); exit(-1); } //3.设置当前进程的工作目录为根目录,不依赖于其他 chdir("/"); //4.umask设置为0确保将来进程有最大的文件操作权限 umask(0); //5.关闭文件描述符 //先要获取当前系统中所允许打开的最大文件描述符数目 int i = 0; int cnt = sysconf(_SC_OPEN_MAX); for (i=0;i
Résultats des tests :
Processus démon :
Les deux php les plus critiques les fonctions ici sont pcntl_fork() et posix_setsid()
fork() un processus, ce qui signifie qu'une copie du processus en cours est créée. La copie est considérée comme un processus enfant et le processus d'origine est considéré comme le parent. processus. Une fois fork() exécuté, il peut être séparé du processus et du contrôle de terminal qui l'ont démarré, ce qui signifie également que le processus parent peut se terminer librement. setsid(), cela fait d'abord que le nouveau processus devienne le "leader" d'une nouvelle session, et finalement fait que le processus ne contrôle plus le terminal. C'est aussi l'étape la plus critique pour devenir un processus démon, ce qui signifie qu'il ne le fera pas. être forcé à la fermeture du terminal. Quitter le processus. Il s’agit d’une étape critique pour un processus résident qui ne peut être interrompu. Effectuez le dernier fork(). Cette étape n'est pas nécessaire, mais elle est généralement effectuée. Sa plus grande importance est d'empêcher l'obtention du terminal de contrôle. (Lorsqu'un terminal est ouvert directement et que l'indicateur O_NOCTTY n'est pas utilisé, le terminal de contrôle sera obtenu)
Autres questions :
Le processus démon chdir() hérite de l'état actuel du parent processus par défaut Répertoire de travail, lorsque le disque système est démonté, cela causera beaucoup de problèmes. Habituellement, "/" est utilisé comme répertoire de travail actuel du processus démon, ce qui peut éviter les problèmes ci-dessus. hérite du masque d'autorisation de fichier du processus parent par défaut. Cela apporte beaucoup de problèmes au sous-processus utilisant des fichiers. Par conséquent, définir le masque d'autorisation de fichier sur 0 peut améliorer considérablement la flexibilité du démon fclose(STDIN), fclose(STDOUT), fclose(STDERR) ferme le flux d'E/S standard. Le processus enfant créé à l'aide de la fonction fork héritera de certains fichiers ouverts du processus parent. Ces fichiers ouverts peuvent ne jamais être lus ou écrits par le démon, mais ils consomment toujours des ressources système et peuvent rendre le système de fichiers dans lequel ils résident impossible à monter.
Recommandations associées :
Démon de processus php-cgi sous Windows
PHP utilise le processus comme méthode démon, php démon de processus
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!