2010-07-08 5 views
2

J'ai besoin d'un travail cron pour vérifier les comptes de messagerie et télécharger certaines pièces jointes. Ce travail cron sera exécuté chaque minute. Mon problème est que lorsque le premier script télécharge des pièces jointes, un second (ou troisième ou quatrième ...) script sera exécuté le long du script précédemment exécuté. Le problème est que je ne suis pas sûr de la meilleure façon d'empêcher les scripts suivants d'essayer de télécharger les pièces jointes que les scripts précédents ont téléchargés (ou téléchargent actuellement).Télécharger des pièces jointes par e-mail via Cron Jobs Simulataneous - Condition de course

Autres détails:

  • Utilisation CodeIgniter
  • Utilisation de la bibliothèque Zend Mail pour accéder à des e-mails et télécharger des pièces jointes
  • Email va probablement être POP3

Je me demande si je peut utiliser l'en-tête "message-id" en quelque sorte.

Répondre

2

Vous pouvez simplement empêcher l'exécution de scripts cron simultanés à l'aide d'un fichier de verrouillage. Vous ne voulez probablement pas que des scripts simultanés téléchargent les pièces jointes, vous aurez des conditions de course désagréables.

fonctionne comme ceci:

starter.sh

  • vérifie si le fichier existe verrouillage, si elle le fait, quitter immédiatement.
  • Si ce n'est pas le cas, il crée un fichier de verrouillage et lance le script main.php.
  • Après la fin de main.php, le fichier de verrouillage est supprimé.
  • De cette façon, si main.php se bloque ou déclenche une exception, le fichier de verrouillage est supprimé et il est capable de redémarrer la minute suivante.

main.php

  • -ce que le téléchargement réel.

Modifier

Je vois. Vous avez ensuite besoin d'une configuration plus complexe. script à un seul thread qui lit le from, subject et datetime, et les colle dans une file d'attente (une table db est parfaite pour cela). Cela devrait fonctionner comme je l'ai expliqué ci-dessus. Deuxièmement, vous avez un pool de processus php qui lisent la table db et télécharge les pièces jointes en fonction des données de la table. Comme ils travaillent avec une structure de données de thread sécurisé (la base de données), ils peuvent définir un indicateur sur chaque ligne qui dit téléchargement/téléchargé.

Ils travaillent simplement une boucle avec un choix de sql en haut (sélectionnez les premiers messages non téléchargés/téléchargés). Vous aurez besoin de quelque chose pour gérer les plantages et redémarrer les processus php, mais c'est la solution.

+0

Plusieurs scripts s'exécutant en même temps sont en fait idéaux. J'essaie de simuler le multi-threading. Je fais face à des milliers de pièces jointes par heure. – StackOverflowNewbie