Как отключить ctrl-z, ctrl-c от выхода из PHP скрипт
Может ли кто-нибудь указать меня в правильном направлении для исследования того, как запретить пользователям выходить из php script с помощью Ctrl + Z, Ctrl + C?
Ответы
Ответ 1
Если вы скомпилировали php с PCNTL (Process Control) и не используете Windows, вы можете использовать pcntl_signal()
.
Вот пример здесь, который я модифицировал, и, похоже, он улавливает 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
, ничего не произойдет, но я не знаю почему.
Ответ 2
Есть способ сделать это, отключив в оболочке.
Источник здесь.
#!/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 для захвата нажатий клавиш. надеюсь это поможет.
Ответ 3
Используйте ignore_user_abort. Установите в php.ini ignore_user_abort значение true. Если изменить на ИСТИННЫЕ скрипты не будут прекращены после того, как клиент прервал их соединение, значит script закончит.
ignore_user_abort(true);
или
$ php my_script.php -d ignore_user_abort = true
Ответ 4
Попробуйте запустить его в фоновом режиме (добавить и до конца команды):
./your_php_script &
Ответ 5
Если вы используете числовые значения (а не встроенные PHP-константы), то, похоже, это работает, по крайней мере для меня, в системе Debian/Ubuntu.
Как ни странно, в моем примере ниже функция callback 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;
}
?>
Ответ 6
Если вам нужно, чтобы ваш скрипт игнорировал определенный сигнал, используйте параметр константы SIG_IGN. Для сигнала SIGINT код будет
pcntl_signal(SIGINT, SIG_IGN);
Ответ 7
Если возможно, вы можете обернуть основной цикл в блок try-catch и вырезать исключение Abort/Interrupt (не уверен, что это точно, извините, мой PHP немного ржавый)