Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何禁用ctrl-z、ctrl-c以防破坏php脚本_Php_Signals - Fatal编程技术网

如何禁用ctrl-z、ctrl-c以防破坏php脚本

如何禁用ctrl-z、ctrl-c以防破坏php脚本,php,signals,Php,Signals,有人能告诉我研究如何防止用户使用Ctrl+Z、Ctrl+C破解php脚本的正确方向吗?试着在后台运行它(添加&到命令末尾): 使用函数。在php.ini ignore_user_abort中将其设置为true。如果更改为TRUE,则在客户端中止连接后,脚本不会终止,因此脚本将完成 ignore_user_abort(true); 或 如果可行,您可以将主循环包装在一个try-catch块中,并挤压中止/中断异常(不确定确切的异常,抱歉,我的PHP有点生锈)如果您使用(进程控制)编译PHP,并且

有人能告诉我研究如何防止用户使用Ctrl+Z、Ctrl+C破解php脚本的正确方向吗?

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

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

ignore_user_abort(true);


如果可行,您可以将主循环包装在一个try-catch块中,并挤压中止/中断异常(不确定确切的异常,抱歉,我的PHP有点生锈)

如果您使用(进程控制)编译PHP,并且没有运行您可以使用的Windows

我修改了一个示例,它似乎捕捉到了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) {

}

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

在这里

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

# your script 
echo " Test"

# loop for sleep
sleep 5
20代表CTRL+Z

2代表CTRL+C

这是由trap-|命令创建的完整列表

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来捕获击键。希望这能有所帮助。

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

奇怪的是,在我下面的示例中,没有调用回调函数signal_handler()。相反,它只在输入行上显示“^Z”和“^C”,而忽略信号。最后,不可能中断/暂停,这有望回答最初的问题:

#!/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;
}
?>
#/usr/bin/php

如果只需要脚本忽略特定信号,请使用SIG\u IGN constant选项。对于SIGINT信号,代码为

pcntl_signal(SIGINT, SIG_IGN);

你的意思是在命令行上吗?是的,将是一个运行的命令行脚本,本质上我不希望用户能够突破它。很抱歉,帖子中的粗制滥造的详细信息仍在唤醒中。如果脚本需要用户交互怎么办?当然,我的解决方案不适用于需要任何交互的脚本Ctrl+z将冻结它,though@teksolo和@silent我从未测试过它,但如果知道它是否适用于网络交互,那就太好了。不过,OP在评论中表示,他希望将其用于命令行脚本。这不仅适用于web,您还可以查看documentation@silent:好的,在重新阅读在线文档之后,它不仅仅是针对web的。然而,它是用于客户机-服务器交互的(在我看来,在使用PHP时通常是通过web进行的)。它对命令行脚本不起作用(至少对我不起作用)。另外,SIGTSTP用于Ctrl+ZSIGSTP,SIGSTOP是不同的信号:)@silent:谢谢。我显然不知道我在这里说的是什么,空循环的例子对我不起作用,Ctrl+C被忽略了。添加usleep时(1);或一个回声“1”;它成功了,这很好。还可以将处理程序定义为回调,而不是单独的函数。声明
滴答声
很重要,如果没有声明,信号会被捕获,但处理程序不会执行,也就是说,您会被困在脚本中。虽然缺少详细信息,但这个答案似乎是命令行脚本的唯一方法,因此我不会获得否决票。因为PHP中没有中止/中断异常
#!/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;
}
?>
pcntl_signal(SIGINT, SIG_IGN);