Maison > développement back-end > tutoriel php > Comment implémenter la démonisation PHP

Comment implémenter la démonisation PHP

墨辰丷
Libérer: 2023-03-26 08:30:02
original
2146 Les gens l'ont consulté

Cet article présente principalement la méthode et le principe du processus de réalisation du démonisation PHP, ainsi que le code implémenté dans l'environnement C et l'environnement PHP. Les amis qui l'aiment peuvent le sauvegarder.

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 (utilisation non recommandée 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
Copier après la connexion

Résultats des tests :

Processus démon :


Les deux fonctions PHP les plus critiques ici sont pcntl_fork() et posix_setsid()

Fork() un processus signifie créer une copie du processus en cours d'exécution. La copie est considérée comme un processus enfant et le processus d'origine est considéré comme le processus parent. 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 notes :

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 :

Deux processus démons en php

Exemples de programmation d'implémentation multi-processus PHP

PHP implémente le multi-processus et le multi-threading

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal