Как отключить 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 немного ржавый)