2010-05-05 21 views
14

Puede alguien me punto en la dirección correcta para la investigación de cómo evitar que los usuarios salir de un script php con Ctrl + Z, Ctrl + C?cómo deshabilitar Ctrl-Z, Ctrl-C de salir de un script php

+4

¿Quiere decir en la línea de comandos? –

+0

Sí, se ejecutará un script de línea de comandos del que no quiero que los usuarios puedan salir, esencialmente. Perdón por los detalles de mala calidad en la publicación, aún despertando. – teksolo

Respuesta

2

intento ejecutarlo en segundo plano (añadir & al final del comando):

./your_php_script & 
+0

¿Qué sucede si el script requiere la interacción del usuario? – GreenMatt

+0

Por supuesto, mi solución no es utilizable para scripts que requieran cualquier interacción – silent

4

Uso ignore_user_abort función. Establezca esto en php.ini ignore_user_abort en true. Si se cambian a TRUE, los scripts no finalizarán después de que un cliente haya abortado su conexión, por lo que el script finalizará.

ignore_user_abort(true); 

o

$ php my_script.php -d ignore_user_abort = true 
+0

ctrl + z lo congelarán de todos modos, aunque – silent

+0

@teksolo y @silent Nunca lo probé, pero sería bueno saber si se comporta –

+0

Esto es para interacciones web. Sin embargo, en un comentario, el OP dice que quiere esto para un script de línea de comando. – GreenMatt

-1

Si es factible, se puede envolver el bucle principal en un bloque try-catch, y aplastar la excepción Abortar/interrupción (no estoy seguro el exacto, lo siento, mi PHP es un poco oxidado)

+0

Si bien no tengo muchos detalles, el enfoque de esta respuesta parece ser el único para un guión de línea de comando, por lo que no obtengo el voto en baja. – GreenMatt

+2

porque no hay excepción de interrupción/aborto en PHP –

16

Si tiene compilado php con PCNTL (Control de proceso) y no está utilizando Windows, puede usar pcntl_signal().

No es un ejemplo here la que he modificado, y parece que coger bien 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) { 

} 

Si intenta instalar un controlador para SIGSTP no pasa nada, pero no sé qué.

+1

Además SIGTSTP es para Ctrl + Z – silent

+1

SIGSTP y SIGSTOP son señales diferentes :) – silent

+1

@silent: gracias. claramente no sé de lo que estoy hablando aquí –

4

Hay una manera de hacerlo desactivando en el shell.

Source está aquí.

#!/bin/bash 
# at start add 
trap "" 2 20 

# your script 
echo " Test" 

# loop for sleep 
sleep 5 

20 es para CTRL + Z

2 es para CTRL + C

y esta es la lista completa de los creada por la trampa - | 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 

sin embargo, para hacer esto directamente desde PHP es difícil, no estoy seguro de cómo hacerlo o si se puede hacer. de lo contrario, algunos sitios sugirieron javascript para capturar las pulsaciones de teclas. espero que esto ayude.

0

Si utiliza los valores numéricos (en lugar de las constantes de PHP integradas), entonces parece funcionar, al menos para mí, en un sistema Debian/Ubuntu.

Por extraño que parezca, en mi ejemplo a continuación, la función de devolución de llamada signal_handler() no se está llamando. En cambio, solo muestra "^ Z" y "^ C" en la línea de entrada, mientras que las señales simplemente se ignoran. Al final, no es posible romper/suspender, lo que con suerte responde a la pregunta original:

#!/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; 
} 
?> 
Cuestiones relacionadas