PHP进程信号处理

不言
不言asal
2018-05-02 09:10:252166semak imbas

这篇文章主要介绍了关于PHP进程信号处理,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

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


假设现在有以上这么一个PHP脚本,我们想要脚本在收到SIGINT、SIGTERM等进程信号时,输出一段信息并结束脚本,该如何实现呢?

使用pcntl_signal和pcntl_signal_dispatch函数即可(注意PHP需要安装pcntl扩展才能使用这两个函数),见代码:

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

这里写图片描述
在linux shell中执行该脚本,然后使用kill -2 脚本进程ID命令向进程发送信号,脚本正常输出信息并退出。

相关推荐:

PHP进程间通信详解

PHP进程通信基础之信号量与共享内存通信

PHP进程锁的有关内容

Atas ialah kandungan terperinci PHP进程信号处理. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:PHP判断指定目录下是否存在文件Artikel seterusnya:PHP的数据类型