2010-11-22 7 views
0

J'ai une application web, écrite en PHP (Zend Framework) et je voudrais exécuter un (quelques) script (s) de temps en temps. Par exemple une fois par jour. Je sais que cela peut être fait en utilisant crontab et cronjobs, mais pas tous les hébergeurs ont ces disponibles. Donc je cherche une solution sans utiliser le Cronjob.Tâches planifiées (cronjob-aternative) avec le framework Zend?

Comment résolvez-vous ceci? Quelles sont les possibilités?

+0

Il serait intéressant de voir s'il existe une alternative, mais à ma connaissance il n'y en a pas. –

+0

Zend Server (l'édition commerciale) dispose d'une file d'attente de tâches qui peut effectuer des tâches récurrentes. – Gordon

Répondre

4

Les travaux Cron offrent en réalité seulement quelques avantages de base: la planification, l'exécution et la journalisation. Ce sont toutes les choses qui sont assez faciles à reproduire dans une application PHP ...

Première étape: créer une table des tâches

Vous auriez besoin de stocker:

  1. Fréquence des exécution
  2. Que exécuter (inclure le fichier, le rappel, le code eval, etc.)
  3. Calculer la date de la prochaine exécution
  4. précédent run magasin d Ates

Deuxième étape: Exécution

Vous avez quelques options sur la façon de déclencher réellement les tâches:

  1. Appel d'une image GIF vierge généré par PHP sur chaque course de page, qui déclenche le code cron.
  2. Appel d'un script AJAX qui exécute le code cron
  3. appel normalement dans votre application (peut ralentir l'exécution)

Peu importe comment il démarre, il déclencherait le code Cron réel, qui décide si il n'y a pas de tâches à exécuter, et celles à exécuter.

Troisième étape: Connexion

Celui-ci devrait être assez simple. Enregistrez simplement ce qui se passe pendant les tâches dans un fichier que vous pouvez lire après pour vous assurer qu'il fonctionne.

...

Avant d'exécuter une tâche, vous souhaitez mettre à jour la date de l'exécution précédente, et après l'exécution d'une tâche, vous devez créer la prochaine date d'exécution, en fonction de sa fréquence. Le seul inconvénient de cette méthode est que lorsque personne ne visite les sites, aucun travail ne sera exécuté jusqu'à ce que le prochain visiteur arrive.

+0

Oui, c'est la direction que je voulais suggérer, mais Adrian articulé beaucoup plus clairement que je l'aurais fait. –

+0

+0 Comme vous le montrez à l'étape 2, l'exécution n'aura lieu que lorsqu'un événement extérieur plutôt imprévisible est déclenché. Cette solution n'est donc pratique que si vous avez un flux constant de visiteurs sur votre site. Un travail CRON s'exécute lorsqu'il est censé s'exécuter. – Gordon

+0

Cela semble être la bonne direction :-) Merci beaucoup pour les options !! L'option 3 de l'exécution est en effet hors de question pour le ralentissement possible de l'application. – koko

4

Vous pouvez utiliser un service comme celui-ci:

CronLess

Configurer votre script pour être accessible depuis l'extérieur, et laissez cet appel l'URL du service. Pour des raisons de sécurité, vous pourriez protéger le script avec une sorte de jeton.

+0

Nous aimerions l'avoir dans l'application elle-même, donc si le service s'arrêtait, nos applications seraient toujours utilisables. Merci pour la suggestion si :-) – koko

+0

Vous n'avez pas besoin d'un tel service. –

+0

sûr que le "code" est dans votre application, le service appelle juste une url fournie .. – opHASnoNAME

0

J'ai fait quelque chose de similaire @Adrian Schneider solution.Si vous voulez ajouter plus de cohérence à votre application, vous pouvez ajouter une interface Cronable qui force les classes qui l'implémentent à ajouter une fonction cron() qui va gérer la logique interne du cron, qui est parfois différente. Tout ceci peut être enveloppé et appelé de la même manière par un wrapper cron qui sera le seul script appelé par le cron dans le système, qui décidera quels sont les jobs cron PHP à exécuter. Vous pouvez avoir plus de détails dans ma réponse de here.

1
0

Je suis d'accord avec la réponse de Arne si vous utilisez déjà zend framework, vous devez implémenter votre solution en utilisant le construit en Zend_Queue qui est réellement fait pour cela. Pour voir comment implémenter cela, voici un lien vers une autre question qui décrit comment configurer votre infrastructure. Infrastructure for Running your Zend Queue Receiver