2009-08-04 5 views
1

J'ai un cron qui s'exécute pour l'instant toutes les 20 minutes, mais qui finit par tourner une fois par minute. Ce cron traitera potentiellement des centaines de fonctions qui récupèrent un fichier XML à distance, le traitent et exécutent ses tâches. Le problème est, en raison de la vitesse des sites distants, ce script peut parfois prendre un certain temps à courir.Traitement de nombreux flux rss/xml dans un fichier cron sans surcharger le serveur

Existe-t-il un moyen sûr de le faire sans [a] expiration du script, [b] surcharger le serveur [c] et ne pas terminer sa tâche avant qu'elle ne s'exécute à nouveau (cette erreur?)

Malheureusement, la mise en cache n'est pas une option car les données changent presque en temps réel et proviennent de diverses sources.

Répondre

2

Je pense qu'un léger changement de conception serait bénéfique pour ce processus. Étant donné qu'un serveur distant peut expirer, ou qu'une connexion peut être lente, vous rencontrerez certainement des problèmes de simultanéité si un travail lent écrit toujours des fichiers quand un autre démarre.

Je le diviserais en deux scripts séparés. Avoir un script qui est seulement utilisé pour récupérer les dernières données XML, et un autre pour le traiter. Le script de récupération peut prendre un peu de temps s'il le faut, tandis que le script de processus recherche continuellement le fichier le plus récent disponible pour le traiter. De cette façon, ils peuvent fonctionner indépendamment, et le script de traitement peut toujours fonctionner avec les données les plus récentes, quel que soit le temps nécessaire à l'exécution du script.

+0

Bon plan, de cette façon, rien ne se passe jusqu'à ce que les données soient récupérées avec succès. Merci pour le conseil! – mrpatg

+0

Maintenant, c'est une belle addition, bonne pensée zombat. –

2

une pile que vous gardez tous les emplois sur, une poignée de fils qui est le travail consiste à:

  • Pop un emploi de la pile
  • Vérifiez si vous avez besoin de rafraîchir le fichier xml (vérifier les etags, expirer les en-têtes, etc.)
  • saisir le XML (c'est le bit qui pourrait prendre le temps de répartir la charge sur les threads) si nécessaire, cela devrait expirer si cela prend trop de temps et augmenter le Fait il fait à quelqu'un comme vous pourriez avoir un site vers le bas, générateur rss dodgy ou autre.
  • processus il

De cette façon, vous serez en mesure de saisir beaucoup de données à chaque fois.

Il se pourrait que vous n'avez pas besoin de saisir le fichier du tout (serait utile si vous pouvez stocker la dernière ETAG pour un fichier etc.)

Un conseil, ne vous attendez pas un d'entre eux à être dans un format valide. Suggestion que vous jetez un oeil à Mark Pilgrims RSS RegExp lecteur qui fait un excellent travail de lecture de la plupart des RSS

Ajout: Je dirais que frapper les mêmes sites chaque minute ne joue pas vraiment bien aux serveurs et crée beaucoup de travail pour votre serveur, avez-vous vraiment besoin de le frapper si souvent?

0

Vous devez vous assurer de lire la balise <ttl> des flux que vous saisissez pour vous assurer que vous ne saisissez pas inutilement les flux avant qu'ils ne changent. <ttl> contient la période de mise à jour. Donc, si un flux a <ttl>60</ttl> alors il devrait être mis à jour toutes les 60 minutes.

Questions connexes