php cli 安全中断退出

WBOY
Freigeben: 2016-06-06 20:41:00
Original
1983 Leute haben es durchsucht

一个phpcli小程序,用

while(1){
....
}

方式处理队列任务(主要是写入mysql一些日志), 求教如果控制台kill掉这个进程

怎么安全中断, 接受kill (或者 前台的 ctrl+z) 信号
处理完一个任务, 输出 byebye 再退出

谢谢

回复内容:

一个phpcli小程序,用

while(1){
....
}

方式处理队列任务(主要是写入mysql一些日志), 求教如果控制台kill掉这个进程

怎么安全中断, 接受kill (或者 前台的 ctrl+z) 信号
处理完一个任务, 输出 byebye 再退出

谢谢

若需要脚本终止时被调用,可以使用register_shutdown_function()或者__destruct(),但这个问题显然需要进程控制,信号处理器。

Ctrl-C送SIGINT信号,默认进程会结束,但是进程自己可以重定义收到这个信号的行为。

Ctrl-Z送SIGSTOP信号,进程只是被停止,再送SIGCONT信号,进程继续运行,涉及到命令有jobs,fg,bg。

参考进程控制扩展预定义常量,http://php.net/manual/zh/function.pcntl-signal.php给出一段代码,引用如下:

<code><?php //使用ticks需要PHP 4.3.0以上版本
declare(ticks = 1);

//信号处理函数
function sig_handler($signo)
{
     switch ($signo) {
        case SIGTERM:
            // 处理SIGTERM信号
            exit;
            break;
        case SIGHUP:
            //处理SIGHUP信号
            break;
        case SIGUSR1:
            echo "Caught SIGUSR1...\n";
            break;
        default:
            // 处理所有其他信号
     }
}

echo "Installing signal handler...\n";

//安装信号处理器
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP,  "sig_handler");
pcntl_signal(SIGUSR1, "sig_handler");

// 或者在PHP 4.3.0以上版本可以使用对象方法
// pcntl_signal(SIGUSR1, array($obj, "do_something");

echo "Generating signal SIGTERM to self...\n";

//向当前进程发送SIGUSR1信号
posix_kill(posix_getpid(), SIGUSR1);

echo "Done\n";
</code></code>
Nach dem Login kopieren

针对你的问题的面向过程式示例代码,当然也可以采用面向对象方式:

<code><?php function shutdown()
{
    echo PHP_EOL.'shutdown'.PHP_EOL;
}

register_shutdown_function('shutdown');

//使用ticks需要PHP 4.3.0以上版本
declare(ticks = 1);

//信号处理函数
function sig_handler($signo)
{
     switch ($signo) {
        case SIGTERM:
            // 处理kill
            echo PHP_EOL.'kill';
            exit;
            break;
        case SIGHUP:
            //处理SIGHUP信号
            break;
        case SIGINT:
            //处理ctrl+c
            echo PHP_EOL.'ctrl+c';
            exit;
            break;
        default:
            // 处理所有其他信号
     }
}

//安装信号处理器
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP,  "sig_handler");
pcntl_signal(SIGINT,  "sig_handler");


while(true){
    echo '.';
    sleep(1);
}
</code></code>
Nach dem Login kopieren

以上例子当执行ctrl+c或者kill时会输出

<code>➜  
....^C
ctrl+c
shutdown
➜  
.........
kill
shutdown
</code>
Nach dem Login kopieren

ps -ef | grep php
会列出当前工作的脚本,看看那个路径对应的PID
然后Kill -9 {pid}

不知道还有没有更好的办法。

Verwandte Etiketten:
php
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!