如何禁用ctrl-z,ctrl-c打破php脚本

时间:2010-05-05 14:57:36

标签: php signals

有人能指出我正确的方向来研究如何使用 Ctrl + Z Ctrl + C

7 个答案:

答案 0 :(得分:17)

如果您使用PCNTL(过程控制)编译了php并且未运行Windows,则可以使用pcntl_signal()

我修改了一个示例here,它似乎抓住了Ctrl-C ok:

<?php
declare(ticks = 1);

pcntl_signal(SIGINT, "signal_handler");

function signal_handler($signal) {
    switch($signal) {
        case SIGINT:
            print "Ctrl C\n";
    }
}

while(1) {

}

如果您尝试为SIGSTP安装处理程序,则不会发生任何事情,但我不知道原因。

答案 1 :(得分:5)

有一种方法可以通过在shell中禁用来实现。

Source就在这里。

#!/bin/bash
# at start add
trap "" 2 20

# your script 
echo " Test"

# loop for sleep
sleep 5

20表示CTRL + Z

2适用于CTRL + C

这是陷阱创建的完整列表 - |命令

1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
9) SIGKILL      10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT
17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU
25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH
29) SIGIO       30) SIGPWR      31) SIGSYS      34) SIGRTMIN
35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4
39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6
59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

然而,直接从PHP执行此操作很困难,我不知道该怎么做或者是否可以完成。否则一些网站建议使用javascript来捕捉击键。希望这有帮助。

答案 2 :(得分:4)

使用ignore_user_abort功能。将此设置在php.ini ignore_user_abort 中设置为true。如果更改为TRUE脚本将在客户端中止其连接后终止,则脚本将完成。

ignore_user_abort(true);

$ php my_script.php -d ignore_user_abort = true

答案 3 :(得分:2)

尝试在后台运行它(添加到命令末尾):

./your_php_script &

答案 4 :(得分:0)

如果你使用数值(而不是内置的PHP常量),那么它似乎在Debian / Ubuntu系统上起作用,至少对我来说是这样。

奇怪的是,在我下面的例子中,没有调用回调函数signal_handler()。相反,它只显示&#34; ^ Z&#34;和&#34; ^ C&#34;在输入线上,信号被忽略。最后,没有中断/暂停是可能的,这有望回答原来的问题:

#!/usr/bin/php
<?
pcntl_signal( 2, "signal_handler");
pcntl_signal( 20, "signal_handler");

function signal_handler( $signal )
{
  echo( "This is not even invoked..?\n" );
}

$end = FALSE;

while( $end == FALSE )
{
  echo( "Enter Q to quit: " );
  $fp = fopen( "php://stdin", "r" );
  $line = fgets( $fp ); 
  $line = str_replace( "\n", "", $line );
  fclose( $fp );

  if( strtolower($line) == "q" ) $end = TRUE;
}
?>

答案 5 :(得分:0)

如果您只需要脚本来忽略特定信号,请使用SIG_IGN常量选项。对于SIGINT信号,代码为

pcntl_signal(SIGINT, SIG_IGN);

答案 6 :(得分:-1)

如果可行,你可以将主循环包装在try-catch块中,然后压缩Abort / Interrupt异常(不确定确切的异常,抱歉,我的PHP有点生锈)