3 votes

Persistance de $_POST en utilisant un appel AJAX

J'essaie de mettre en place un système de commentaires, dans lequel lorsque les utilisateurs envoient le commentaire, celui-ci est affiché sur leur écran comme s'il était déjà stocké dans la base de données. Ma question est la suivante : que se passe-t-il si l'utilisateur envoie un commentaire et qu'il s'éloigne ensuite (ou plus précisément s'il ferme immédiatement la fenêtre) ou s'il perd la connexion après l'envoi par ajax ?

Du côté du code, j'ai ajax({}) ...

Ensuite, j'ai un code qui prend la saisie de l'utilisateur dans la zone de texte et l'ajoute à un div.

Cela signifie que l'utilisateur peut voir instantanément le commentaire qu'il a saisi. Mais je voudrais être sûr que le serveur obtiendra les informations sur le message même si la connexion a été perdue, si la fenêtre a été fermée ou si l'utilisateur a quitté le site.


Plus d'informations pour la question :

Un utilisateur envoie un post au serveur avec 1mb de valeurs, puis juste après une milliseconde il/elle a cliqué sur le bouton qui a fait le post la fenêtre du navigateur a été fermée.

Est-ce que le serveur reçoit et analyse la réponse avec ignore_user_abort(true); à l'intérieur du fichier ; l'info postale a-t-elle été reçue ?

Une différence si c'était get au lieu de post pour ce cas ?

Supposons que website.com?myget=value

Essayer de se connecter puis fermer la fenêtre immédiatement, sur une fenêtre de navigateur par exemple, en tapant simplement sur la barre d'adresse et en fermant tout de suite, imaginez que ce soit automatiquement.

étape 1 aller à website.com?myget=value (n'attendez pas la réponse du serveur. tout de suite (une milliseconde ou ce que prend le script pour le faire) fermez complètement la fenêtre.

Serait-ce $_GET['myget'] sera reçu côté serveur à index.php de site web.com ?

1voto

Ayman Safadi Points 8354

Il s'agit d'un problème d'interface utilisateur, pas d'un problème technique. Ce que vous voulez faire, c'est afficher le nouveau commentaire seulement après qu'il ait été enregistré. Le flux de travail devrait se dérouler comme suit :

  1. L'utilisateur tape un message
  2. L'utilisateur clique sur le bouton "soumettre".
  3. Le système grise le bouton "soumettre" et affiche un message qui dit, "Enregistrement..."
  4. Lorsque le système peut confirmer que le message a été transmis avec succès le système supprimera le texte "Posting..." et affichera le nouveau message. nouveau message.

De cette façon, l'utilisateur sait qu'il ne doit pas fermer son navigateur ou naviguer ailleurs avant que la requête ne soit terminée.


Vous pouvez également onbeforeunload pour avertir vos utilisateurs d'attendre avant de fermer le navigateur ou de naviguer ailleurs. Le flux de travail est quelque chose comme :

Prérequis : Vous avez un compteur persistant quelque part (cookie, stockage local, champ caché, etc.). Lorsque la page se charge, il commence à 0 .

  1. L'utilisateur tape un message
  2. L'utilisateur clique sur le bouton "soumettre".
  3. La demande AJAX est envoyée
  4. Le compteur est augmenté de 1
  5. La demande est terminée, vous obtenez une réponse (qu'elle soit réussie ou non - la gestion des erreurs est une autre question), diminuez le compteur de la façon suivante 1

Si à un moment donné, le unload est déclenché, le système vérifiera le compteur. Si celui-ci est supérieur à 0 pour avertir l'utilisateur que sa demande n'a pas été satisfaite et qu'il risque de perdre son commentaire (à la manière de Gmail).

1voto

Viktor S. Points 12026

J'ajouterai mes cinq cents. Avec ajax({}) vous demanderez au navigateur de commencer à communiquer avec votre serveur. Il a besoin d'un certain temps pour établir la connexion (temps de ping) et envoyer des données au serveur. Ces deux parties nécessitent un certain temps pour être complétées. Pour que PHP puisse commencer à s'exécuter, le navigateur doit envoyer toutes les données qu'il doit envoyer. Peu importe que ce soit POST ou GET. Si l'utilisateur interrompt la procédure d'envoi (navigateur bloqué, onglet fermé, ordinateur éteint), PHP ne sera même pas lancé. Par exemple, vous pouvez essayer d'envoyer un gros fichier et voir avec un débogueur quand le script de PHP sera lancé - seulement après que le fichier soit livré complètement (vous pouvez même fermer votre navigateur avant que le fichier soit téléchargé et voir si votre script est exécuté du tout). Il est logique de ne lancer l'exécution de PHP qu'après la livraison de toutes les données au serveur et d'ignorer les connexions interrompues avant la livraison des données. Sinon, il pourrait y avoir des problèmes avec des données corrompues. Et personne ne veut cela. De plus, imaginez que PHP soit lancé avant que tout soit livré au serveur : vous ne serez jamais sûr que $_POST["something"] n'est pas disponible car il n'a jamais été saisi par l'utilisateur ou ses données n'ont pas encore été livrées.

Il n'y a aucune différence si vous utilisez un formulaire ordinaire ou XMLHTTPRequest. Dans les deux cas, le navigateur a besoin d'un certain temps pour établir une connexion avec le serveur et lui transmettre des données.

0voto

Mike Brant Points 39322

Dans la plupart des cas, toute action que vous effectuez sur le serveur continuera à être exécutée jusqu'à ce que le PHP s'exécutant sur le serveur tente de renvoyer les résultats au navigateur. C'est seulement à ce moment que PHP vérifiera si la connexion existe toujours et fera ce qu'il doit faire en fonction des paramètres d'interruption de l'utilisateur. Ainsi, si vous souhaitez par exemple recevoir le message, mettre à jour une entrée de la base de données, puis renvoyer un message de réussite, l'activité de la base de données devrait se poursuivre tant que vous n'avez pas effectué de sortie avant que la base de données ne soit interrogée.

POST ou GET ne fait aucune différence dans ce comportement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X