UPDATE
Sposób obsługi tej obudowie jest połączenie buforowania wyjściowego i odpowiednie nagłówki HTTP.
Z HTTP/1.1 Specification Section 14.10:
HTTP/1.1 definiuje „zamknij” możliwość podłączenia się do nadawcy sygnał, że połączenie zostaje zamknięty po zakończeniu reakcji .
Tak więc, jeśli mamy przejść HTTP Content-Length nagłówek oprócz Connection: close przeglądarka wie, aby zamknąć połączenie po odebraniu określonej długości odpowiedź:
- Buforuj WSZYSTKIE wyjścia skryptu, aby zachować możliwość wysyłania nagłówków.
- Po uzyskaniu pełnych danych wyjściowych wyślij odpowiednie nagłówki do klienta.
- Kontynuuj r przetwarzanie ... ale nie próbuj wysyłać danych wyjściowych lub otrzymasz błędy, ponieważ nagłówki zostały wysłane.
Należy również zachować ostrożność, ponieważ można uzyskać więcej czasu na wykonanie skryptu w SAPI serwera WWW, jeśli przetwarzanie jest zbyt duże. Na koniec powinieneś powiedzieć PHP, aby zignorował "user abort" w tym konkretnym skrypcie, używając ignore_user_abort()
, ponieważ przeglądarka zamknie połączenie w wyniku tego, co robisz i chcesz, aby PHP kontynuowało przetwarzanie.
<?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 ...
?>
Można zbadać sekcji podręcznika PHP na Connection handlingdocs.
Alternatywnie, dlaczego nie rozpocząć buforowania wyjściowego? Następnie możesz przechwycić wszystkie dane wyjściowe, które zostaną wysłane, a następnie zdecydować później, jeśli chcesz coś z tym zrobić.
<?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();
?>
Dlaczego trzeba to zrobić? Czy możesz opublikować trochę kodu, aby pomóc nam zrozumieć trochę więcej? –
+1 do tego, co powiedział Jonathan. Powiedz nam coś więcej o tym, dlaczego chcesz to zrobić. –