90 votes

Le meilleur moyen de gérer un script php de longue durée?

J'ai un script PHP qui prend du temps (de 5 à 30 minutes). Seulement en cas de questions, le script est à l'aide de cUrl pour recueillir des données à partir d'un autre serveur. C'est la raison pour laquelle il est si long; il doit attendre pour chaque page à charger avant de les traiter et de passer au suivant.

Je veux être en mesure de lancer le script et la laisser jusqu'à ce qu'il fait, qui permettra de définir un indicateur dans une table de base de données.

Le problème est que je suis en train de faire l'init appel à partir d'une application iPhone, qui n'est pas comme une demande qui prend tellement de temps. Je veux que la demande initiale d'être terminé rapidement.

Donc en résumé, ce que j'ai besoin de savoir, c'est comment être en mesure de mettre fin à la requête http, avant la fin du script en cours d'exécution. Aussi, est un script php la meilleure façon de le faire? (Mon serveur prend en charge Ruby on Rails, Python, Perl, Curl<-pas sûr de ce que c'est en se référant à) Bien que je n'ai pas d'expérience dans les autres langues.

123voto

symcbean Points 27412

Certes, cela peut être fait avec PHP, mais vous ne devriez PAS le faire en tâche de fond: le nouveau processus doit être dissocié du groupe de processus où il est lancé.

Puisque les gens continuent à donner la même mauvaise réponse à cette FAQ, j'ai écrit une réponse plus complète ici:

http://symcbean.blogspot.com/2010/02/php-and-long-running-processes.html

C.

11voto

FlorianH Points 1722

La façon rapide et sale serait d'utiliser l' ignore_user_abort fonction en php. Cela dit en gros: Ne se soucient pas ce que fait l'utilisateur, exécutez ce script que c'est fini. C'est un peu dangereux si c'est un site web public (parce qu'il est possible, que vous finissez par avoir 20++ versions du script en cours d'exécution dans le même temps, si elle est initiée 20 fois).

La manière "propre" (au moins à mon humble avis) est de définir un indicateur (en db par exemple) lorsque vous souhaitez lancer le processus et d'exécuter une tâche cron toutes les heures (ou plus) pour vérifier si cette option est activée. Si elle EST définie, le long d'exécuter le script démarre, si elle ne l'est PAS, rien ne se passe.

8voto

Leon Timmermans Points 23230

Vous pouvez utiliser exec ou système pour démarrer une tâche en arrière-plan, puis faire le travail.

Aussi, il y a de meilleures approches pour racler le web que celui que vous êtes en utilisant. Vous pouvez utiliser une tige filetée qui approche (plusieurs threads de faire une page à la fois), ou à l'aide d'un eventloop (un fil de la réalisation de plusieurs pages à la fois). Mon approche personnelle à l'aide de Perl serait à l'aide de AnyEvent::HTTP.

ETA: symcbean expliqué comment détacher le processus d'arrière-plan correctement ici.

5voto

jamieb Points 2892

Non, PHP n'est pas la meilleure solution.

Je ne suis pas sûr de Ruby ou de Perl, mais avec Python, vous pourriez réécrire votre grattoir pour qu'il soit multi-thread et qu'il fonctionnerait probablement au moins 20 fois plus vite. Écrire des applications multithreads peut s'avérer être un défi, mais la toute première application Python que j'ai écrite était un grattoir de pages multithreads. Et vous pouvez simplement appeler le script Python depuis votre page PHP en utilisant l’une des fonctions d’exécution du shell.

3voto

daotoad Points 17916

PHP peut ou peut ne pas être le meilleur outil, mais vous savez comment l'utiliser, et le reste de votre application est écrite à l'aide. Ces deux qualités, combiné avec le fait que PHP est "assez bon" faire un assez fort pour qu'il l'aide, au lieu de Perl, Ruby ou Python.

Si votre but est d'apprendre une autre langue, puis choisissez-en un et de l'utiliser. N'importe quelle langue que vous avez mentionnés va faire le travail, pas de problème. Il m'arrive de comme Perl, mais ce que vous aimez peut être différent.

Symcbean a quelques bons conseils sur la façon de gérer les processus d'arrière-plan à son lien.

En bref, écrire un script PHP CLI pour gérer le long bits. Assurez-vous que l'état des rapports d'une certaine façon. Faire une page php pour gérer les mises à jour de statut, soit à l'aide d'AJAX ou de méthodes traditionnelles. Votre script de démarrage sera le début du processus qui s'exécute dans sa propre session, et le retour de la confirmation que le processus est en cours.

Bonne chance.

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