Uno script PHP può abortire se stesso o rilevare l'aborto?
Domanda
Gli script PHP possono continuare l'esecuzione dopo Richiesta pagina HTTP , quindi come posso finalmente interrompere l'esecuzione quando ho finito?
Inoltre, c'è un evento per rilevare quando il sistema operativo sta per interrompere forzatamente lo script? o come posso mantenere un timer interno per prevedere max_execution_time
?
Soluzione
Puoi utilizzare register_shutdown_function
per registrare una funzione da chiamare alla fine dell'esecuzione dello script. Puoi usarlo per rilevare quando lo script è stato terminato ed eseguire un certo insieme di azioni.
Altri suggerimenti
exit () / die () interromperà uno script php.
Per sapere quando interrompere lo script, devi solo utilizzare microtime come timer e salva come costante (o recupera dal file php.ini) il tempo massimo di esecuzione.
Puoi anche consultare le Gestione delle connessioni . Dove abbiamo cose come connection_aborted () e connection_status ()
Ma qual è il problema che stai cercando di risolvere?
Per avere una richiamata nel momento in cui la tua richiesta viene chiusa, usa register_shutdown_function (myfunction)
.
Proprio come la maggior parte degli ambienti POSIX, PHP supporta anche gestori di segnali . Puoi registrare il tuo gestore per l'evento SIGTERM
.
function my_abort_handler( $signo ) {
echo "Aborted";
}
pcntl_signal( SIGTERM, "my_abort_handler" );
Potresti 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.
Bene, potresti iniziare un $ start = microtime (true)
che restituirà un timestamp. Quindi puoi semplicemente continuare a controllare microtime (true)
e sottrarlo dal tuo orario di inizio per ottenere il numero di secondi dall'esecuzione.
Ma no, non puoi " catturare " lo script come terminato per il motivo della richiesta troppo lunga. Potresti provare a fare alcune cose dell'ultimo minuto nel gestore dello spegnimento, ma non sono sicuro che PHP lo onorerà.
Sembra che ci fosse una funzione che fa esattamente quello che vuoi, connection_timeout () , ma è stato deprecato e rimosso. Non so se c'è qualche tipo di sostituzione per questo, tuttavia.