UPDATE
Il modo per gestire questo caso è una combinazione di buffer di uscita e le intestazioni HTTP appropriate.
Dal HTTP/1.1 Specification Section 14.10:
HTTP/1.1 definisce il "close" per collegare al mittente di segnale che la connessione verrà chiusa dopo il completamento della risposta .
Quindi, se si passa lungo un HTTP Content-Length intestazione oltre a Connection: close, il browser sa per chiudere la connessione dopo la lunghezza di risposta specificato ricevuto:
- Buffer TUTTO l'output degli script in modo da mantenere la capacità di inviare intestazioni
- Una volta che hai i dati di output completi, invia le intestazioni appropriate al client
- Continua tu r elaborazione ... ma non provare a inviare output o riceverai errori perché le intestazioni sono state inviate.
Inoltre, fare attenzione a come è possibile eseguire contro di script limiti di tempo di esecuzione in SAPI web server se si fa troppo l'elaborazione. Infine, dovresti dire a PHP di ignorare un "abortito utente" in questo particolare script usando ignore_user_abort()
perché il browser chiuderà la connessione come risultato di ciò che stai facendo e vuoi che PHP continui l'elaborazione.
<?php
ignore_user_abort();
ob_start();
// do stuff, generate output
// get size of the content
$length = ob_get_length();
// tell client to close the connection after $length bytes received
header('Connection: close');
header("Content-Length: $length");
// flush all output
ob_end_flush();
ob_flush();
flush();
// close session if you have one ...
// continue your processing tasks ...
?>
si potrebbe esaminare la sezione del manuale PHP su Connection handlingdocs.
In alternativa, perché non avviare il buffering dell'output? Quindi puoi catturare tutto l'output che verrebbe inviato quindi decidere in seguito se in realtà vuoi fare qualcosa con esso.
<?php
echo 'before output buffering';
ob_start();
echo 'after output buffering';
$output = ob_get_contents();
// script's only output to this point will be 'before output buffering'
// I changed my mind, send the output ...
ob_end_flush();
?>
Perché avete bisogno di fare questo? Puoi pubblicare un po 'del tuo codice per aiutarci a capire un po' di più? –
+1 a quello che ha detto Jonathan. Dicci qualcosa di più sul perché vuoi farlo. –