Supposons que j'entre une URL dans mon navigateur et que le navigateur soumette la demande HTTP. Le serveur HTTP distant accepte la demande et lance une longue tâche pour répondre à la demande.
Si je résilie la demande avant qu'elle ne soit terminée (par exemple, appuyez sur Echap ou dans Firefox), comment la demande est-elle fermée? Le navigateur communiquera-t-il cette demande d'abandon au serveur (je pense que non)?
En supposant que non, une fois la longue tâche terminée, que fera le serveur du résultat? Le renvoie-t-il quand même? Si c'est le cas, que se passera-t-il? At-il atteint jusqu'à mon PC? Ou se perd sur le chemin?
C'est juste pour ma curiosité.
Merci pour votre temps :)
Réponses:
Eh bien, tout dépend de ce que fait le serveur. En règle générale, il ne "détectera" pas la demande terminée tant qu'un envoi n'a pas été tenté. À ce stade, le script recevra un message user_abort du serveur Web (en php, vous pouvez lui dire d'ignorer l'utilisateur abandonne avec
ignore_user_abort(true);
). Sans tenter d'envoyer des données au client, le serveur n'a aucun moyen de savoir que la demande a été abandonnée.Lorsqu'il essaie d'envoyer la demande à la connexion TCP fermée, ce qui se passe dépend entièrement du logiciel serveur. Apache fonctionne comme ceci: si les données envoyées sont encore pendant le traitement d'un script dynamique, il informera le script de l'abandon et le laissera le gérer comme il le souhaite (PHP - par défaut - se termine). Si le script est terminé, ou s'il s'agit d'une demande de fichier statique, il ignorera simplement la connexion fermée et reviendra.
la source
Je pense que c'est à penser au genre de chose électrique. charge. lorsqu'une connexion se termine, les données envoyées sont payantes, elles disparaissent simplement car aucune prise d'écoute n'est disponible pour ce transfert particulier. seulement s'il y a une prise, une communication se produit.
Exemple:
Nous avons frappé
http://localhost
pour apache2 httpd. supposons qu'il ne fonctionne pas. Le navigateur ouvre un socket, envoie un message au port 80 (par défaut) et recherche s'il y a une réponse. Puisqu'il n'y a aucun écouteur car apache n'est pas en cours d'exécution, cette requête ping n'obtient aucune réponse du tout. au moins 200 ok ou tout type de poignée de main du tout. alors qu'arrive-t-il à notre ping? http envoie quelque chose: commeGET http://localhost 80
... etc. qu'arrive-t-il à cette ligne?GET http://localhost 80
? c'est juste une charge et disparaît.C'est juste ma conviction, et nous devons d'abord nous référer à TCP pour plus de clarté. Ce n'est qu'alors que nous pouvons comprendre comment se comportent le protocole Internet et le http suivant. En fin de compte, il ne semble pas y avoir de définition concrète pour une requête http terminée prématurément. C'est pourquoi il est appelé résiliation prématurée.
la source