2010-11-12 13 views
3

Je travaille sur un système d'emailer que je dois brancher dans un CMS pour une compagnie. Je suis à la recherche d'un moyen de faire exécuter le script de l'expéditeur de courrier électronique en arrière-plan pendant que l'administrateur peut naviguer ou même fermer les navigateurs.Exécuter le script PHP en arrière-plan ... quelles sont les meilleures solutions pour mon cas?

J'ai trouvé la fonction PHP nommée ignore_user_abort() qui est requise pour garder la page en cours d'exécution même si elle a expiré.

Maintenant, j'ai trois solutions pour « lancer le script »:

  1. je pouvais utiliser une iframe

  2. Je pourrais utiliser un appel Ajax que je l'ai déjà configuré pour délai d'attente très tôt. Ex: en utilisant le jQuery framework: $.ajaxSetup({ timeout: 1000 });

  3. Je pourrais utiliser un travail cron mais je voudrais éviter cette solution car ils sont "virtuels" et instables sur ce serveur.

Existe-t-il d'autres solutions? Je n'aime pas vraiment la solution iframe mais je les utilise déjà avec un script uploader Ajax.

Je ne veux pas que l'administrateur tape F5 et commence une deuxième instance de celui-ci.

Les utilisateurs de l'entreprise ont été invités à se connecter uniquement au CMS en utilisant Firefox. Merci

+0

fait l'utilisateur a appuyer sur un bouton (ou quelque chose) pour lancer le processus d'envoi? –

+0

Oui, il le fait. Après avoir modifié le contenu de l'e-mail et importé sa liste de contacts. Il doit appuyer sur un bouton. – Cybrix

+0

Vous pouvez simplement utiliser votre propre suggestion, mais ajouter quelque chose dans la base de données qui indique son exécution ou étiqueter un fichier tmp ou même une variable de session pour l'empêcher de s'exécuter deux fois s'il touche f5. – superfro

Répondre

9

Vous pouvez exécuter un script PHP en arrière-plan en utilisant Exec().

php docs fournissent un exemple sur la façon dont vous pouvez le faire:

function execInBackground($cmd) { 
    if (substr(php_uname(), 0, 7) == "Windows"){ 
     pclose(popen("start /B ". $cmd, "r")); 
    } 
    else { 
     exec($cmd . " > /dev/null &"); 
    } 
} 
+0

La page va-t-elle se bloquer alors que le script PHP exécuté dans 'exec()' est en cours d'exécution? – Cybrix

+1

@Cybrix non, c'est le point. Une commande passant par cette fonction s'exécutera en arrière-plan, de sorte que l'utilisateur est libre de quitter la page et il n'aura pas à attendre que la commande soit finie. –

+0

Ensuite, cela semble être une option. J'ai déjà contacté le support technique pour voir si je (ou plus spécifiquement le script) autorisé à utiliser la commande exec(). Je vous tiendrai au courant. – Cybrix

0

Si je vous, j'écrirait un démon de fond pour le faire. Je voudrais sauvegarder tous mes courriels dans une base de données dans l'appel HTTP d'origine et avoir un script fonctionnant constamment en arrière-plan qui vérifie toutes les 30 secondes, par exemple, pour voir s'il y a des courriels en attente et les envoie ensuite. Cela vous permet également de rechercher les doublons lorsque vous ajoutez des e-mails à la file d'attente, vous n'avez donc pas à vous soucier des ajouts multiples.


Modifier raison de votre Compte tenu de ne pas utiliser les tâches cron Je ne voudrais pas utiliser cette approche (à savoir que vous n'avez pas accès shell au serveur). Au lieu de cela, je voudrais avoir un premier appel AJAX où le PHP a inséré tous les emails dans une base de données, et a renvoyé une clé au Javascript. J'aurais alors un appel Javascript, utilisant cette clé, où PHP a traité les emails pendant 5 secondes, puis renvoyé le nombre d'emails restant au navigateur. Je voudrais alors que Javascript répète cette demande jusqu'à ce qu'il n'y ait plus d'emails. Cela aurait l'avantage supplémentaire que vous pouviez avoir des notifications de progression et, si le serveur plantait pour une raison quelconque, vos emails seraient récupérables.

+0

Est-ce que "ça" est un travail cron? : P – Cybrix

+0

@Cybrix Non, ce serait une commande shell. Comme il semble que vous ne puissiez pas utiliser les commandes du shell, j'utiliserais l'approche que je viens de détailler dans mon édition. – lonesomeday

+0

Merci pour la solution, mais l'utilisateur doit pouvoir quitter la page ou fermer le navigateur. – Cybrix

0

Tout simplement parce que vous fermez le navigateur, le script démarré par PHP ne devrait pas arrêter l'exécution.Donc, comme je le vois, vous avez deux façons de le faire:

  1. Envoyer un POST au serveur lui indiquant que vous voulez faire une action, et le script exécute jusqu'à ce qu'il se termine. Le rechargement de la page avertira le navigateur que vous aurez besoin de renvoyer les données etc ... Vous pouvez faire le POST de manière asynchrone avec javascript pour éviter cela et être capable de faire d'autres choses pendant l'exécution du script. Une chose à surveiller ici est que le temps d'exécution du script peut être limité.

  2. Envoyer un POST à ​​un script qui lance à son tour un processus de système d'arrière-plan en faisant la même chose. Mais maintenant, vous ne serez pas en mesure de trouver les progrès sauf si vous enregistrez l'état quelque part, dans une base de données ou quelque chose

  3. Cron (vous semblez déjà avoir exploré cette option)