Załóżmy, że wpisuję adres URL w przeglądarce, a przeglądarka przesyła żądanie HTTP. Zdalny serwer HTTP przyjmuje żądanie i inicjuje długie zadanie obsługi żądania.
Jeśli zakończę żądanie przed jego zakończeniem (na przykład naciśnij klawisz Esc lub w przeglądarce Firefox), jak zostanie ono zamknięte? Czy przeglądarka przekaże serwerowi żądanie przerwania (myślę, że tak nie jest)?
Zakładając, że nie, po zakończeniu długiego zadania, co serwer zrobi z rezultatem? Czy mimo to odsyła go z powrotem? Jeśli tak, co się stanie? Czy dociera do mojego komputera? A może zgubisz się w drodze?
To tylko z mojej ciekawości.
Dziękuję za Twój czas :)
Odpowiedzi:
Wszystko zależy od tego, co robi serwer. Zazwyczaj nie „wykrywa” zakończonego żądania, dopóki nie zostanie podjęta próba wysłania. W tym momencie skrypt otrzyma komunikat user_abort z serwera WWW (w php możesz powiedzieć mu, aby ignorował przerwanie przez użytkownika
ignore_user_abort(true);
). Bez próby wysłania danych do klienta serwer nie może wiedzieć, że żądanie zostało przerwane.Gdy próbuje wysłać żądanie do zamkniętego połączenia TCP, to, co się dzieje, jest całkowicie zależne od oprogramowania serwera. Apache działa w następujący sposób: jeśli wysyłane dane są nadal przetwarzane przez skrypt dynamiczny, poinformuje skrypt o przerwaniu i pozwoli obsłużyć go tak, jak chce (PHP - domyślnie - kończy się). Jeśli skrypt jest gotowy lub jest to żądanie pliku statycznego, po prostu zignoruje zamknięte połączenie i zwróci.
źródło
Myślę, że należy myśleć o rzeczach związanych z elektrycznością. opłata. gdy pewne połączenie zostanie zakończone, przesyłane dane są opłatą, po prostu znika, ponieważ nie ma dostępnego gniazda odsłuchowego dla tego konkretnego transferu. tylko jeśli jest gniazdo, następuje pewna komunikacja.
Przykład:
Trafiliśmy
http://localhost
na apache2 httpd. załóżmy, że nie działa. Przeglądarka otwiera gniazdo, wysyła komunikat do portu 80 (domyślnie) i sprawdza, czy jest jakaś odpowiedź. Ponieważ nie ma nasłuchiwania, ponieważ apache nie jest uruchomiony, to żądanie ping nie otrzymuje żadnej odpowiedzi. co najmniej 200 ok lub jakikolwiek uścisk dłoni w ogóle. co dzieje się z naszym pingiem? http wysyła coś: jakGET http://localhost 80
... itd. co dzieje się z tą linią?GET http://localhost 80
? to tylko ładunek i znika.To tylko moje przekonanie i powinniśmy najpierw odwołać się do TCP dla większej przejrzystości. Tylko wtedy możemy zrozumieć, jak zachowują się protokół internetowy i kolejne http. Ostatecznie nie ma konkretnej definicji przedwcześnie zakończonego żądania HTTP. Dlatego nazywa się to przedwczesnym zakończeniem.
źródło