Кто-то может указать на меня в корректном направлении для исследования, как препятствовать тому, чтобы пользователи убежали из сценария PHP с Ctrl+Z, Ctrl+C?
Есть способ сделать это, отключив в оболочке.
Источник здесь.
#!/bin/bash
# at start add
trap "" 2 20
# your script
echo " Test"
# loop for sleep
sleep 5
20 для CTRL + Z
2 для CTRL + C
и это полный список созданных ловушкой - | command
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 для захвата нажатий клавиш. надеюсь это поможет.
Используйте функцию ignore_user_abort . Установите в php.ini ignore_user_abort значение true. Если изменить значение на ИСТИНА, сценарии не будут завершены после того, как клиент прервал свое соединение, поэтому сценарий завершится.
ignore_user_abort(true);
или
$ php my_script.php -d ignore_user_abort = true
Попробуйте запустить его в фоне (добавьте & в конец команды):
./your_php_script &
Если это возможно, вы можете обернуть главный цикл в блок try-catch и подавить исключение Abort/Interrupt (не уверен в точности, извините, мой PHP немного заржавел)
.Если у вас php скомпилирован с PCNTL (Process Control) и не работает под Windows, вы можете использовать pcntl_signal()
.
Есть пример здесь, который я изменил, и он, кажется, нормально ловит Ctrl-C:
<?php
declare(ticks = 1);
pcntl_signal(SIGINT, "signal_handler");
function signal_handler($signal) {
switch($signal) {
case SIGINT:
print "Ctrl C\n";
}
}
while(1) {
}
Если вы попытаетесь установить обработчик для SIGSTP
, ничего не произойдет, но я не знаю почему.