Maison  >  Article  >  développement back-end  >  Gestion des signaux de processus PHP

Gestion des signaux de processus PHP

不言
不言original
2018-05-02 09:10:252106parcourir

Cet article présente principalement le traitement du signal du processus PHP, qui a une certaine valeur de référence. Maintenant, je le partage avec tout le monde. Les amis dans le besoin peuvent s'y référer

<?php
while (1)
 {
     echo "I am doing something important\n";    
     echo "If i am interruptted, the data will be corrupted\n";    
     echo "Be careful\n";    
     echo "\n\n";
    sleep(5);
}


. Supposons que nous ayons le script PHP ci-dessus. Nous voulons que le script génère une information et termine le script lorsqu'il reçoit des signaux de processus tels que SIGINT et SIGTERM. Comment y parvenir ?

Utilisez simplement les fonctions pcntl_signal et pcntl_signal_dispatch (notez que PHP doit installer l'extension pcntl pour utiliser ces deux fonctions), voir le code :

<?php/**
 * 信号ID和信号名称对应关系,没注释掉的信号都是可以通过pcntl_signal函数注册的
 */
 $GLOBALS[&#39;G_SIG_MAP&#39;] = array(
     1 => &#39;SIGHUP&#39;,    
     2 => &#39;SIGINT&#39;,    
     3 => &#39;SIGQUIT&#39;,    
     4 => &#39;SIGILL&#39;,    
     5 => &#39;SIGTRAP&#39;,    
     6 => &#39;SIGABRT&#39;,    
     7 => &#39;SIGEMT&#39;,    
     8 => &#39;SIGFPE&#39;,    
     //9 => &#39;SIGKILL&#39;,
    10 => &#39;SIGBUS&#39;,    
    11 => &#39;SIGSEGV&#39;,    
    12 => &#39;SIGSYS&#39;,    
    13 => &#39;SIGPIPE&#39;,    
    14 => &#39;SIGALRM&#39;,    
    15 => &#39;SIGTERM&#39;,    
    16 => &#39;SIGURG&#39;,    
    //17 => &#39;SIGSTOP&#39;,
    18 => &#39;SIGTSTP&#39;,    
    19 => &#39;SIGCONT&#39;,    
    20 => &#39;SIGCHLD&#39;,    
    21 => &#39;SIGTTIN&#39;,    
    22 => &#39;SIGTTOU&#39;,    
    23 => &#39;SIGIO&#39;,    
    24 => &#39;SIGXCPU&#39;,    
    25 => &#39;SIGXFSZ&#39;,    
    26 => &#39;SIGVTALRM&#39;,    
    27 => &#39;SIGPROF&#39;,    
    28 => &#39;SIGWINCH&#39;,    
    29 => &#39;SIGINFO&#39;,    
    30 => &#39;SIGUSR1&#39;,    
    31 => &#39;SIGUSR2&#39;,
);
/**
 * 进程信号处理函数
 * @param int $signo 信号ID
 */function signalHandler($signo) {
    if (isset($GLOBALS[&#39;G_SIG_MAP&#39;][$signo])) {  
    echo "Caught signal {$GLOBALS[&#39;G_SIG_MAP&#39;][$signo]}, exit\n";
    } else {      
              echo "Caught unknown signal:$signo";
    }    
    exit();
}foreach ($GLOBALS[&#39;G_SIG_MAP&#39;] as $id => $name) {
    pcntl_signal($id, &#39;signalHandler&#39;);
}while (1) {
                echo "I am doing something important\n";    
                echo "If i am interruptted, the data will be corrupted\n";    
                echo "Be careful\n";    echo "\n\n";
    pcntl_signal_dispatch(); // 此函数调用必须放在循环体内
    sleep(5);
}

Gestion des signaux de processus PHP
dans le shell Linux Exécutez le script, puis utilisez la commande kill -2 脚本进程ID pour envoyer un signal au processus. Le script affichera les informations normalement et se terminera.

Recommandations associées :

Explication détaillée de la communication inter-processus PHP

Communication par sémaphore et mémoire partagée basée sur la communication de processus PHP

Contenu lié au verrouillage des processus 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!

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