有人能指出我正确的方向来研究如何使用 Ctrl + Z , Ctrl + C
答案 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有点生锈)