Может ли кто-то указать меня в правильном направлении для исследования того, как запретить пользователям выходить из PHP-скрипта с помощью Ctrl + Z , Ctrl + C ?
Если у вас есть 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
ничего не произойдет, но я не знаю почему.
Есть способ сделать это, отключив в оболочке.
Источник здесь.
#!/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 для захвата нажатий клавиш. надеюсь это поможет.
Используйте функцию ignore_user_abort . Установите в php.ini ignore_user_abort значение true. Если изменить на TRUE, сценарии не будут прекращены после того, как клиент прервет свое соединение, поэтому скрипт завершится.
ignore_user_abort(true);
или
$ php my_script.php -d ignore_user_abort = true
Попробуйте запустить его в фоновом режиме (добавить и до конца команды):
./your_php_script &
Если вы используете числовые значения (а не встроенные 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; } ?>
Если это возможно, вы можете обернуть основной цикл в блок try-catch и вырезать исключение Abort / Interrupt (не уверен, что это точно, извините, мой PHP немного ржавый)