Domanda

Prima configuro il mio script per l'esecuzione anche dopo che la richiesta HTTP è terminata

 ignore_user_abort(true);

quindi svuota del testo.

 echo "Thats all folks!";
 flush();

Ora, come posso indurre il browser a pensare che la richiesta HTTP sia finita? così posso continuare a fare il mio lavoro senza che il browser mostri " caricamento della pagina " ;.

 header(??) // something like this?
È stato utile?

Soluzione

Ecco come farlo. Dite al browser di leggere i primi N caratteri dell'output e quindi chiudere la connessione, mentre lo script continua a funzionare fino a quando non viene completato.

<?php
ob_end_clean();
header("Connection: close");
ignore_user_abort(true); // optional
ob_start();
echo ('Text the user will see');
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();     // Will not work
flush();            // Unless both are called !

// At this point, the browser has closed connection to the web server

// Do processing here
echo('Text user will never see');
?>

Altri suggerimenti

Le intestazioni non funzioneranno (sono intestazioni, quindi arrivano prima )

Non conosco alcun modo per chiudere la connessione http senza terminare lo script, anche se suppongo che ci sia un modo oscuro di farlo.

Dicci cosa vuoi fare dopo che la richiesta è stata fatta ci aiuterebbe a dare suggerimenti migliori.

Ma in generale, penserei a uno dei seguenti:

1) Esegui alcuni semplici script da riga di comando (usando exec ()) che assomiglia a:

#!/bin/sh
php myscript.php <arg1> <arg2> .. <argN> &

Quindi dai il via allo script associato a http come:

<?PHP
exec('/path/to/my/script.sh');
?>

o

2) Scrivi un altro programma (possibilmente un demone in esecuzione continua, o solo qualche script che viene collegato così spesso) e scopri come il tuo codice richiesto può passare istruzioni. È possibile disporre di una tabella di database che funzioni le code o provare a farlo funzionare con un file flat di qualche tipo. Puoi anche fare in modo che il tuo script basato sul web chiami alcuni comandi della riga di comando che causano la messa in coda del tuo script fuori richiesta.

Alla fine, non vuoi che lo script continui a essere eseguito dopo la richiesta http. Supponendo che tu stia utilizzando mod_php, ciò significa che eseguirai un processo apache fino al termine dello script.

Forse questo particolare commento sulla pagina di manuale di php.net aiuterà: http://www.php.net/manual/en/features.connection-handling.php#71172

Teoricamente, se HTTP 1.1 keep-alive è abilitato e il client riceve la quantità di caratteri che si aspetta dal server, dovrebbe considerarlo come la fine della risposta e andare avanti e rendere la pagina (mantenendo la connessione ferma aperto.) Prova a inviare queste intestazioni (se non puoi abilitarle in un altro modo):

Connection: keep-alive
Content-Length: n

Dove n è la quantità di caratteri che hai inviato nel corpo della risposta (il buffering dell'output può aiutarti a contarlo.) Mi dispiace di non avere il tempo di provarlo da solo. Sto solo dando il suggerimento nel caso funzioni.

Il modo migliore per farlo è usare il buffering dell'output. PHP invia le intestazioni quando è buono e pronto, ma se avvolgi il tuo output nel browser con ob_ * puoi controllare le intestazioni in ogni fase.

Se lo desideri, puoi conservare una pagina di rendering nel buffer e inviare le intestazioni fino a quando il sole sorge in Cina. Questa pratica è il motivo per cui potresti vedere molti tag di apertura <?php, ma oggigiorno nessun tag di chiusura. Impedisce allo script di inviare prematuramente eventuali intestazioni poiché potrebbero essere presi in considerazione alcuni include.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top