2012-01-18 9 views
18

Sto chiamando uno script php su ajax per eseguire la manutenzione del database. Se l'utente chiude la pagina, risponde o fa clic su un collegamento, lo script php verrà eseguito completamente? C'è un modo per farlo?Cosa accade se un utente esce dal browser o cambia pagina prima che la richiesta AJAX sia scaduta

Forse se lo script php chiamato il metodo exec() o qualcosa di simile, che a sua volta chiamare uno script tramite la console in quanto tale:

$ php /var/www/httpdocs/maintenance.php 

?

risposta

13

Fintantoché l'agente utente (browser, ecc.) Ha completamente inviato la richiesta, il server ha tutto ciò di cui ha bisogno e completa la richiesta e tenta di inviare una risposta.

In effetti, questo tipo di comportamento "ping" viene spesso utilizzato per processi "heartbeat" che mantengono un servizio caldo o eseguono una manutenzione periodica.

2

Una volta che la richiesta Web viene inviata al server, non importa se l'utente chiude il browser o si allontana. Il tuo server risponderà comunque, ma nessuno ascolterà la risposta.

+0

c'è un modo per evitarlo? –

+0

@SushantBajracharya È possibile utilizzare una variabile impostata su "1" quando viene effettuata la chiamata e se l'utente tenta di reindirizzare mentre la variabile è "1", viene visualizzato un messaggio che indica che non è possibile. Al termine della chiamata, torna a "0" e consente il reindirizzamento. –

14

È una condizione di gara. PHP rileverà ad un certo punto (di solito dopo aver tentato di fare output) che Apache sta urlando in faccia che l'utente remoto ha chiuso la connessione. Se tutto ciò che volevi fare è fatto a quel punto dipende da come è strutturato il tuo codice.

Se si vuole garantire che tutte le operazioni sono state completate prima che lo script si spegne, utilizzare ignore_user_abort(TRUE), che mantiene PHP in esecuzione dopo la connessione viene interrotta. È ancora soggetto ai limiti max_execution_time dell'utente e cosa no, ma non si spegnerà perché hai disconnesso.

+0

Quindi uno script PHP potrebbe fermarsi prima che la sua esecuzione sia terminata se Apache rileva che la connessione remota è stata chiusa? –

+1

Hahaha, ho trovato quella funzione subito dopo la pubblicazione, ho cercato di cancellare la mia domanda e di rispondervi da sola, ma non ho ancora una reputazione sufficientemente alta.Ecco cosa volevo scrivere, mi dispiace di aver fatto perdere tempo con la ricerca della cosa sbagliata: ** Ok, ancora non so cosa succede esattamente ad AJAX, ma ho trovato un modo per impedire agli script PHP di terminare se l'utente interrompe lo script PHP con la funzione: ignore_user_abort() http://php.net/manual/en/function.ignore-user-abort.php avrei fatto la mia ricerca nel corso PHP dall'inizio invece di AJAX, l'ho trovato subito. ** – NaturalBornCamper

+0

Potrebbe, ma non è necessario. ci sono altri fattori in gioco, ma in teoria sì, un utente potrebbe (ad es.) forzare completamente un processo di verifica e-commerce premendo ESC dopo che l'inventario del negozio è stato aggiornato ma prima che il pagamento sia stato elaborato. –

0

Una volta avviata la chiamata ajax, l'utente è libero di fare tutto ciò che desidera. Se chiudono la pagina, semplicemente non riceveranno il feedback (se esiste) dalla chiamata ajax che è stata fatta.

0

Se php viene avviato, continuerà a essere eseguito indipendentemente da se l'utente chiude la finestra o si allontana dalla pagina.

0

Lo script php verrà completato, indipendentemente dallo stato del browser. Il php viene analizzato sul server e non importa se il client è ancora aperto o meno.

0

Se la richiesta HTTP è stata completata, allora sì, lo script PHP verrà eseguito completamente anche se il computer del client è chiuso.

1

Varia a seconda delle impostazioni, del server Web, del sistema operativo e così via.

Generalmente la richiesta verrà elaborata normalmente e la risposta non verrà mai letta. Occasionalmente, una scrittura potrebbe fallire prima e la richiesta non riesce durante l'elaborazione.

Problemi correlati