Question

Je configure d'abord mon script pour qu'il s'exécute même après la fin de la requête HTTP

 ignore_user_abort(true);

puis effacer du texte.

 echo "Thats all folks!";
 flush();

Maintenant, comment puis-je tromper le navigateur en lui faisant croire que la requête HTTP est terminée? je peux donc continuer à faire mon propre travail sans que le navigateur affiche & "Chargement de la page &";.

 header(??) // something like this?
Était-ce utile?

La solution

Voici comment procéder. Vous indiquez au navigateur de lire les N premiers caractères de la sortie, puis de fermer la connexion, tandis que votre script continue de s'exécuter jusqu'à ce que l'opération soit terminée.

<?php
ob_end_clean();
header("Connection: close");
ignore_user_abort(true); // optional
ob_start();
echo ('Text the user will see');
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();     // Will not work
flush();            // Unless both are called !

// At this point, the browser has closed connection to the web server

// Do processing here
echo('Text user will never see');
?>

Autres conseils

Les en-têtes ne fonctionnent pas (ce sont des en-têtes, ils viennent donc en premier )

Je ne connais aucun moyen de fermer la connexion http sans terminer le script, bien que je suppose qu'il existe un moyen obscur de le faire.

Si vous nous indiquez ce que vous souhaitez faire une fois la demande complétée, nous pourrons faire de meilleures suggestions.

Mais généralement, je penserais à l'un des éléments suivants:

1) Exécutez un script de ligne de commande simple (à l'aide de exec ()) qui ressemble à:

#!/bin/sh
php myscript.php <arg1> <arg2> .. <argN> &

Lancez-le à partir de votre script lié à http tel que:

<?PHP
exec('/path/to/my/script.sh');
?>

Ou:

2) Écrivez un autre programme (éventuellement un démon fonctionnant en continu, ou juste un script créé de temps en temps), et déterminez comment votre code dans la requête peut lui transmettre des instructions. Vous pouvez avoir une table de base de données qui fonctionne en file d'attente ou essayer de la faire fonctionner avec un fichier plat quelconque. Vous pouvez également demander à votre script Web d’appeler une commande de ligne de commande qui provoque la mise en attente de votre script hors demande.

En fin de compte, vous ne voulez pas que votre script continue à s'exécuter après la requête http. En supposant que vous utilisiez mod_php, cela signifie que vous lierez un processus apache jusqu'à la fin du script.

Peut-être que ce commentaire sur la page de manuel de php.net sera utile: http://www.php.net/manual/en/features.connection-handling.php#71172

Théoriquement, si HTTP 1.1 Keep-Alive est activé et que le client reçoit le nombre de caractères qu’il attend du serveur, il doit le traiter comme la fin de la réponse et poursuivre le rendu de la page (tout en conservant la connexion). ouvert.) Essayez d’envoyer ces en-têtes (si vous ne pouvez pas les activer autrement):

Connection: keep-alive
Content-Length: n

n est le nombre de caractères que vous avez envoyés dans le corps de la réponse (la mise en mémoire tampon de sortie peut vous aider à compter cela). Je suis désolé de ne pas avoir le temps de le tester moi-même. Je ne fais que suggérer au cas où cela fonctionnerait.

La meilleure façon d’y parvenir consiste à utiliser la mise en mémoire tampon de sortie. PHP envoie les en-têtes quand il est prêt et bon, mais si vous envelopper votre sortie dans le navigateur avec ob_ *, vous pourrez contrôler les en-têtes à chaque étape du processus.

Vous pouvez conserver une page rendue dans la mémoire tampon si vous le souhaitez et envoyer des en-têtes jusqu'à ce que le soleil se lève en Chine. Cette pratique est la raison pour laquelle vous pouvez voir beaucoup de balises <?php ouvertes, mais pas de balises de fermeture de nos jours. Il empêche le script d’envoyer des en-têtes prématurément, car certains éléments à prendre en compte sont également pris en compte.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top