Supongamos que ingreso una URL en mi navegador y el navegador envía la solicitud HTTP. El servidor HTTP remoto acepta la solicitud e inicia una tarea larga para atender la solicitud.
Si finalizo la solicitud antes de que se complete (por ejemplo, presione Esc o en Firefox), ¿cómo se cierra la solicitud? ¿El navegador comunicará esta solicitud de cancelación al servidor (creo que no)?
Suponiendo que no, al completar la tarea larga, ¿qué hará el servidor con el resultado? ¿Lo devuelve de todos modos? Si es así, ¿qué pasará? ¿Llega hasta mi PC? ¿O se pierde en el camino?
Esto es solo para mi curiosidad.
Gracias por tu tiempo :)
Respuestas:
Bueno, todo depende de lo que esté haciendo el servidor. Por lo general, no "detectará" la solicitud finalizada hasta que se intente un envío. En ese punto, el script recibirá un mensaje de "user_abort" del servidor web (en php, puede decirle que ignore al usuario con el que aborta
ignore_user_abort(true);
). Sin intentar enviar datos al cliente, no hay forma de que el servidor sepa que la solicitud fue cancelada.Cuando intenta enviar la solicitud a la conexión TCP cerrada, lo que sucede depende completamente del software del servidor. Apache funciona así: si los datos enviados todavía están mientras se procesa un script dinámico, le informará al script sobre el aborto y le permitirá manejarlo como quiera (PHP, por defecto, finaliza). Si el script está hecho, o es una solicitud de archivo estático, simplemente ignorará la conexión cerrada y volverá.
fuente
Creo que debe pensarse en electricidad. cargar. cuando finaliza alguna conexión, los datos que se envían son una carga, simplemente desaparece, ya que no hay un socket de escucha disponible para esa transferencia en particular. solo si hay un enchufe, se produce alguna comunicación.
Ejemplo:
Golpeamos
http://localhost
para apache2 httpd. supongamos que no se está ejecutando. El navegador abre un socket, envía un mensaje al puerto 80 (predeterminado) y busca si hay alguna respuesta. Como no hay escucha ya que apache no se está ejecutando, esta solicitud de ping no obtiene ninguna respuesta. al menos 200 ok o cualquier tipo de apretón de manos. entonces, ¿qué pasa con nuestro ping? http envía algo: comoGET http://localhost 80
... etc., ¿qué pasa con esta línea?GET http://localhost 80
? Es solo una carga y desaparece.Esto es solo mi creencia, y primero debemos referirnos a TCP para mayor claridad. Solo entonces, podemos entender cómo se comportan el protocolo de Internet y el http posterior. En última instancia, parece que no hay una definición concreta para una solicitud http terminada prematuramente. Es por eso que se llama terminación prematura.
fuente