Maison  >  Article  >  développement back-end  >  PHP implémente un processus démon

PHP implémente un processus démon

藏色散人
藏色散人avant
2019-08-09 14:13:285430parcourir

PHP implémente un processus démon

Processus démon

Le processus démon est une sorte de service de processus résident, très courant, comme PHP -FPM, NGINX, REDIS nécessitent tous deux un processus parent pour prendre en charge l'ensemble du service. Cependant, il est rare d’écrire un processus démon en PHP. Utilisons PHP pour l’implémenter aujourd’hui.

Étapes

● Processus enfant de fork

● Sortie du processus parent

● Configurer une nouvelle session

● Réinitialiser le masque de fichier

● Fermer les entrées et sorties standard

Implémentation

Nous suivons les étapes ci-dessus pour y parvenir, avant cela, nous avons besoin de pcntl et extensions posix, assurez-vous qu’elles sont installées.

function daemon() {
    $pid = pcntl_fork();
    // fork 失败
    if ($pid < 0) {
        exit(&#39;fork failed&#39;);
    } else if ($pid > 0) {
       // 退出父进程
        exit(0);
    }
    // 设置新的会员
    // setsid 有几个注意点
    // 不能是进程组的组长调用
    // 对于进程组组员调用会产生新的会话和进程组,并成为该进程组的唯一成员,调用的进程将脱离终端
    if (posix_setsid() < 0) {
        exit(&#39;set sid failed&#39;);
    }
    // 重置文件掩码
    umask(0);
    // 切换工作目录
    chdir(&#39;/&#39;);
    // 关闭标准输入输出
    fclose(STDIN);
    fclose(STDOUT);
    fclose(STDERR);
}

Détails

// 获取进程ID
var_dump(posix_getpid());
// 获取进程组ID
var_dump(posix_getpgid(posix_getpid()));
// 获取进程会话ID    
var_dump(posix_getsid(posix_getpid()));

Les trois résultats sont les mêmes, ce qui montre que le processus est le leader de la session même s'il est le leader du groupe de processus.

Pourquoi umask est nécessaire (0)

Lorsque vous appelez umask sous Linux, vous verrez une valeur de masque. Ce masque détermine les autorisations pour les fichiers que vous créez. Portée, par exemple, l'umask de ma machine actuelle est

0022

L'autorisation maximale du fichier est 0666 et l'autorisation maximale du répertoire est 0777, puis le répertoire créé par l'utilisateur actuel. L'autorisation est 0755, qui est l'autorisation rwx-rx-rx pour l'utilisateur actuel. Le fichier est 0644 et dispose des autorisations rw-r-r pour l'utilisateur actuel. Donc s’il n’y a pas de masque de réinitialisation, ce sera 0755 pour les répertoires et 0644 pour les fichiers.

Remarque

Si vous utilisez des fonctions telles que echo var_dump dans le processus, assurez-vous de rediriger la sortie standard vers d'autres flux de fichiers. Ajoutez simplement le code suivant.

global $stdin, $stdout, $stderr;
$stdin = fopen(&#39;/dev/null&#39;, &#39;r&#39;);
$stdout = fopen(&#39;/www/php/txt.txt&#39;,&#39;wb&#39;);
$stderr = fopen(&#39;/dev/null&#39;, &#39;wb&#39;);

Étant donné que l'entrée et la sortie standard ont été fermées ci-dessus, le descripteur de fichier fd n'est plus disponible après la réouverture, fd est 0, 1 et 2 à partir de non négatif. Fichiers qui servent simplement d’entrée et de sortie standard. Bien entendu, vous devez y configurer vous-même la redirection.

La fourchette de dernière seconde

Cette question doit être soigneusement étudiée car elle n'est pas nécessaire. Actuellement, je ne vois aucun scénario dans lequel Fork est nécessaire deux fois.

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer