41 votes

PHP Processus d'arrière-plan

Je suis en train de faire un script PHP, j'ai le script terminé, mais il faut environ 10 minutes pour terminer le processus, il est conçu pour faire. Ce n'est pas un problème, mais je suppose que je dois garder la page est chargée pour tout ce temps qui est gênant. Puis-je faire en sorte que je démarre le processus et ensuite revenir 10 minutes plus tard, et il suffit de visualiser le fichier journal qu'il a créé?

50voto

bastiandoeen Points 496

Eh bien, vous pouvez utiliser "ignore_user_abort(vrai)"

Ainsi, le script va continuer à travailler (garder un oeil sur le script de la durée, peut-être ajouter "set_time_limit(0)")

Mais une mise en garde ici: Vous n'allez pas être en mesure d'arrêter un script avec ces deux lignes:

ignore_user_abort(true); 
set_time_limit(0);

Sauf que vous pouvez directement accéder au serveur et de tuer le processus de là! (Été là, fait une boucle sans fin, l'appelant lui-même maintes et maintes fois, fait le serveur de venir à un crissement arrêt, ai crié...)

26voto

Gary Richardson Points 7371

On dirait que vous devriez avoir une file d'attente et un script externe pour le traitement de la file d'attente.

Par exemple, votre script PHP doit mettre une entrée dans une table de base de données et de retourner tout de suite. Puis, un cron cours d'exécution, chaque minute vérifie la file d'attente et les fourches d'un processus pour chaque poste de travail.

L'avantage ici est que vous n'avez pas de verrouillage de apache fil pendant 10 minutes.

8voto

J'ai eu beaucoup de problèmes avec ce genre de processus sous windows; Ma situation est un peu différente dans le fait que je n'ai pas de soins sur la réponse de l' "script"- je voulais le script de début et de permettre à d'autres demandes de page pour passer à travers alors qu'il était occupé à travailler à l'écart.

Pour une raison quelconque; j'ai eu des problèmes avec la pendaison d'autres demandes ou du calendrier après environ 60 secondes (à la fois d'apache et de php ont été mis de temps après environ 20 minutes), Il s'avère également que firefox après 5 minutes (par défaut) de toute façon donc, après ce point, vous ne pouvez pas savoir ce qui se passe à travers le navigateur sans modifier les paramètres de firefox.

J'ai fini par utiliser le processus ouvert et le processus de fermer les méthodes d'ouvrir un php en mode cli comme suit:

pclose(popen("start php myscript.php", "r"));

Ce serait ( à l'aide de démarrer ) ouvrez le processus php et ensuite de tuer le processus de démarrage de quitter php en cours d'exécution pour le temps qu'il fallait de nouveau, vous aurez besoin de tuer le processus manuellement l'arrêter. Il n'a pas besoin de vous pour définir un temps d'arrêt et vous pouvez laisser la page en cours qu'il a appelé de continuer et de sortie pour plus de détails.

Le seul problème avec cela est que si vous avez besoin d'envoyer le script toutes les données, vous feriez soit le faire via une autre source ou la passer le long de la "ligne de commande" en tant que paramètres; ce qui n'est pas si sûr.

Travaillé bien pour ce qu'il nous fallait bien que et assure le script démarre toujours et est autorisé à s'exécuter sans interruption.

6voto

warren Points 12172

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