Как отключить ctrl-z, ctrl-c от того, чтобы убегать из сценария PHP

Кто-то может указать на меня в корректном направлении для исследования, как препятствовать тому, чтобы пользователи убежали из сценария PHP с Ctrl+Z, Ctrl+C?

17
задан Alexander Yancharuk 13 January 2014 в 08:18
поделиться

5 ответов

Есть способ сделать это, отключив в оболочке.

Источник здесь.

#!/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 для захвата нажатий клавиш. надеюсь это поможет.

5
ответ дан 30 November 2019 в 12:50
поделиться

Используйте функцию ignore_user_abort . Установите в php.ini ignore_user_abort значение true. Если изменить значение на ИСТИНА, сценарии не будут завершены после того, как клиент прервал свое соединение, поэтому сценарий завершится.

ignore_user_abort(true);

или

$ php my_script.php -d ignore_user_abort = true
4
ответ дан 30 November 2019 в 12:50
поделиться

Попробуйте запустить его в фоне (добавьте & в конец команды):

./your_php_script &
2
ответ дан 30 November 2019 в 12:50
поделиться

Если это возможно, вы можете обернуть главный цикл в блок try-catch и подавить исключение Abort/Interrupt (не уверен в точности, извините, мой PHP немного заржавел)

.
-1
ответ дан 30 November 2019 в 12:50
поделиться

Если у вас 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, ничего не произойдет, но я не знаю почему.

18
ответ дан 30 November 2019 в 12:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: