2010-05-05 11 views
14

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

+4

Intendi sulla riga di comando? –

+0

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

risposta

2

provo a farlo funzionare in background (aggiungi & alla fine del comando):

./your_php_script & 
+0

Cosa succede se lo script richiede l'interazione dell'utente? – GreenMatt

+0

Ovviamente, la mia soluzione non è utilizzabile per script che richiedono alcuna interazione – silent

4

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 
+0

ctrl + z lo bloccherà comunque, anche se – silent

+0

@teksolo e @silent non l'ho mai testato, ma sarà bello sapere se si comporta –

+0

Questo è per le interazioni web. Tuttavia, in un commento, l'OP dice che vuole questo per uno script da riga di comando. – GreenMatt

-1

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)

+0

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

+2

perché non c'è alcuna eccezione di interruzione/interruzione in PHP –

16

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é.

+1

Inoltre SIGTSTP è per Ctrl + Z – silent

+1

SIGSTP e SIGSTOP sono segnali diversi :) – silent

+1

@silent: grazie. chiaramente non so davvero di cosa sto parlando qui –

4

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.

0

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; 
} 
?> 
Problemi correlati