Question

J'ai un site Web qui fonctionne avec PHP sur le côté serveur.

pages d'accès aux utilisateurs et PHP fait quelques calculs, écrit des données dans une base de données MySQL etc.

Imaginez un utilisateur accède à une page où PHP crée un compte pour l'utilisateur. La création se compose de deux parties: l'insertion des données d'enregistrement dans la table « utilisateurs » et en insérant les paramètres de ce compte dans la table « Paramètres ». Ce sont deux requêtes SQL qui doivent être exécutées l'une après l'autre. Si l'utilisateur quitte la page après la première requête, il n'y a pas de valeurs insérées dans « Paramètres ».

Comment pourrais-je éviter ce problème? Je pense simplement à l'aide ignore_user_abort (true), droit?

est pas utile de ignore_user_abort appeler (vrai) sur le haut de chaque script PHP? Je ne sais pas les cas où il devrait causer des problèmes.

Était-ce utile?

La solution

Pour votre exemple précis, en utilisant les transactions de base de données (comme mentionné par Ignacio) serait l'approche plus appropriée.

Il y a d'autres cas où vous voudrez peut-être faire en sorte que l'utilisateur ne peut pas abandonner tôt, cependant, ne se rapportant pas aux bases de données. Par exemple, si vous mettez à jour la base de données, puis envoyez un message, vous ne voulez pas un utilisateur pour pouvoir arrêter le processus avant que le courrier sort. Dans ce genre de cas, ignore_user_abort serait approprié.

Toutefois, notez qu'un bris de tuyau en raison de la connexion client ne l'interruption arrête pas l'exécution tout de suite , seulement au moment où vous essayez ensuite d'écrire à la sortie du script. Cela peut être en appelant echo ou print, ou même simplement en fermant la balise PHP et en insérant quelques espaces avant d'ouvrir un nouveau (... ?> <?php ...). Donc, si vous avez toute la partie « action » de votre script en haut de la page, avant d'essayer d'écrire tout contenu de la page, vous n'avez pas à vous soucier des interruptions de tuyaux cassés affectant votre logique d'application.

Et bien sûr, vous devriez triez logique d'action du contenu de la page de cette façon de toute façon.

De http://php.net/manual/en/function.ignore-user-abort.php#refsect1-function.ignore-user-abort-notes

  

PHP ne détecte pas que l'utilisateur a annulé la connexion jusqu'à ce qu'une tentative d'envoyer des informations au client. Il suffit à l'aide d'une instruction echo ne garantit pas que l'information est envoyée

Autres conseils

Si vous avez besoin de plusieurs requêtes soit complètement arriver ou pas du tout, alors vous devriez le faire en utilisant correctement les transactions au lieu de mettre un pansement sur le problème.

Il peut être utile pour le côté distant pour annuler une demande si par exemple la demande implique des calculs longs et l'utilisateur décide qu'ils ne ont pas besoin des résultats après tout.

Vous pouvez définir ignore_user_abort dans php.ini:

scroll top