Home  >  Article  >  Backend Development  >  PHP process signal handling

PHP process signal handling

不言
不言Original
2018-05-02 09:10:252107browse

This article mainly introduces PHP process signal processing, which has certain reference value. Now I share it with everyone. Friends in need can refer to it

<?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);
}


Assumptions Now we have the above PHP script. We want the script to output a piece of information and end the script when it receives process signals such as SIGINT and SIGTERM. How to achieve this?

Just use the pcntl_signal and pcntl_signal_dispatch functions (note that PHP needs to install the pcntl extension to use these two functions), see the 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);
}

PHP process signal handling
Execute this in the linux shell script, and then use the kill -2 script process ID command to send a signal to the process. The script outputs the information normally and exits.

Related recommendations:

Detailed explanation of PHP inter-process communication

Semaphore and shared memory communication based on PHP process communication

Contents related to PHP process lock

The above is the detailed content of PHP process signal handling. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn