Qualcuno mi può punto nella giusta direzione per la ricerca di come impedire agli utenti di rottura di uno script PHP con Ctrl + Z, Ctrl +C?Come impedire che Ctrl-Z, ctrl-c da rottura di uno script PHP
risposta
Usa ignore_user_abort funzione. Imposta questo in php.ini ignore_user_abort su true. Se modificato in TRUE gli script non verranno terminati dopo che un client ha interrotto la connessione, quindi lo script finirà.
ignore_user_abort(true);
o
$ php my_script.php -d ignore_user_abort = true
Se possibile, si può avvolgere il ciclo principale in un blocco try-catch, e schiacciare l'eccezione Abort/Interrupt (non sono sicuro quello esatto, mi dispiace, il mio PHP è un po 'arrugginito)
Anche se a corto di dettagli, l'approccio di questa risposta sembra l'unico per uno script da riga di comando, quindi non ottengo il downvote. – GreenMatt
perché non c'è alcuna eccezione di interruzione/interruzione in PHP –
Se si dispone di php compilato con PCNTL (Controllo processo) e non si esegue Windows è possibile utilizzare pcntl_signal()
.
V'è un esempio here che ho modificato, e sembra catturare 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) {
}
Se si tenta di installare un gestore per SIGSTP
non succede nulla, ma io non so perché.
C'è un modo per farlo avendo disattivato nel guscio.
Source è qui.
#!/bin/bash
# at start add
trap "" 2 20
# your script
echo " Test"
# loop for sleep
sleep 5
20 è per CTRL + Z
2 è per i CTRL + C
e questo è l'elenco completo dei creato da trappola - | Comando
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
però per fare questo diritto dal PHP è difficile, io non sono sicuro di come farlo, o se si può fare. in caso contrario alcuni siti hanno suggerito javascript per acquisire sequenze di tasti. spero che questo ti aiuti.
Se si utilizzano i valori numerici (piuttosto che il built-in costanti PHP) allora sembra funzionare, almeno per me, su un sistema Debian/Ubuntu.
Stranamente, nel mio esempio qui di seguito, non si chiede la signal_handler funzione di callback(). Invece, mostra solo "^ Z" e "^ C" sulla linea di input, mentre i segnali vengono semplicemente ignorati. Alla fine, nessuna interruzione/sospensione è possibile, che si spera risponda alla domanda originale:
#!/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;
}
?>
Intendi sulla riga di comando? –
Sì, sarà uno script della riga di comando in esecuzione che non voglio che gli utenti siano in grado di uscire, in sostanza. Ci scusiamo per i dettagli scadenti nel post, ancora svegliandosi. – teksolo