2009-09-15 4 views

risposta

5

È possibile utilizzare register_shutdown_function per registrare una funzione da chiamare alla fine dell'esecuzione dello script. È possibile utilizzarlo per rilevare quando lo script è stato terminato ed eseguire un determinato insieme di azioni.

+0

Ricordare che il callback di spegnimento verrà chiamato solo se l'esecuzione dello script è completa. Se l'utente interrompe la connessione, questo non viene chiamato. –

8

exit()/die() interromperà uno script php.

Per sapere quando interrompere lo script, è sufficiente utilizzare microtime come timer e salvare come costante (o recuperare dal file php.ini) il tempo massimo di esecuzione.

È inoltre possibile visualizzare le informazioni Connection handling. Dove abbiamo cose come connection_aborted() e connection_status()

Ma qual è il problema che stai cercando di risolvere?

1

Bene, è possibile avviare un $start=microtime(true) che restituirà un timestamp. Quindi puoi semplicemente continuare a controllare microtime(true) e sottrarre quello dal tuo orario di inizio per ottenere il numero di secondi dall'esecuzione.

Ma no, non è possibile "catturare" lo script poiché è terminato per il motivo che la richiesta è troppo lunga. Potresti provare a fare alcune cose dell'ultimo minuto nel gestore di shutdown, ma non sono sicuro che PHP lo onorerà.

Sembra che ci sia una funzione che fa esattamente ciò che si desidera, connection_timeout(), ma è stata deprecata e rimossa. Non so se c'è un qualche tipo di sostituzione per questo, comunque.

2

Si consiglia di dare un'occhiata a pcntl-alarm che consente a uno script di inviare un segnale a se stesso. Contiene anche alcuni esempi su come catturare i segnali di kill che possono essere inviati dal sistema operativo. E muori() davvero.

4

Per effettuare una richiamata al momento della chiusura della richiesta, utilizzare register_shutdown_function(myfunction).

Proprio come la maggior parte degli ambienti POSIX, PHP supporta anche signal handlers. È possibile registrare il proprio gestore per l'evento SIGTERM.

function my_abort_handler($signo) { 
    echo "Aborted"; 
} 

pcntl_signal(SIGTERM, "my_abort_handler");