如何禁用ctrl-z、ctrl-c以防破坏php脚本
有人能告诉我研究如何防止用户使用Ctrl+Z、Ctrl+C破解php脚本的正确方向吗?试着在后台运行它(添加&到命令末尾): 使用函数。在php.ini ignore_user_abort中将其设置为true。如果更改为TRUE,则在客户端中止连接后,脚本不会终止,因此脚本将完成如何禁用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,并且
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);