2010-05-11 24 views
1

J'ai une table avec 200 lignes. Je cours un travail de cron toutes les 10 minutes pour effectuer une sorte d'insertion/mise à jour sur la table. L'opération doit être effectuée uniquement sur 5 lignes à la fois chaque fois que le travail cron est exécuté. Ainsi, dans les 10 premières minutes, les enregistrements 1-5 sont mis à jour, les enregistrements 5-10 dans la 20e minute et ainsi de suite.Comment exécuter efficacement ce travail cron?

Lorsque le travail cron s'exécute pour la 20e fois, tous les enregistrements de la table auraient été mis à jour exactement une fois. C'est ce qui doit être réalisé au moins. Et le prochain travail de cron devrait répéter le processus encore.

Le problème: est que, chaque fois qu'un travail sera exécutée, l'opération d'insertion/mise à jour doit être effectuée sur N lignes (pas seulement 5 lignes). Donc, si N est 100, tous les enregistrements auraient été mis à jour par seulement 2 tâches cron. Et le prochain travail cron répéterait le processus à nouveau.

Voici un exemple:

Voici le tableau que j'ai actuellement (200 dossiers). Chaque fois qu'un travail cron s'exécute, il doit choisir N enregistrements (que je définis comme variable en PHP) et mettre à jour le champ time_md5 avec la valeur MD5 de l'heure actuelle.

+---------+-------------------------------------+ 
|  id | time_md5       | 
+---------+-------------------------------------+ 
|  10 | 971324428e62dd6832a2778582559977 | 
|  72 | 1bd58291594543a8cc239d99843a846c | 
|  3 | 9300278bc5f114a290f6ed917ee93736 | 
|  40 | 915bf1c5a1f13404add6612ec452e644 | 
|  599 | 799671e31d5350ff405c8016a38c74eb | 
|  56 | 56302bb119f1d03db3c9093caf98c735 | 
|  798 | 47889aa559636b5512436776afd6ba56 | 
|  8 | 85fdc72d3b51f0b8b356eceac710df14 |  
|  .. | .......        |  
|  .. | .......        |  
|  .. | .......        |  
|  .. | .......        |  
|  340 | 9217eab5adcc47b365b2e00bbdcc011a | <-- 200th record 
+---------+-------------------------------------+ 

Ainsi, le premier enregistrement (id 10) ne doit pas être mis à jour plus d'une fois, jusqu'à ce que tous les 200 dossiers sont mis à jour une fois - le processus devrait recommencer une fois tous les enregistrements sont mis à jour une fois. J'ai une idée de la façon dont cela pourrait être réalisé, mais je suis sûr qu'il existe des moyens plus efficaces de le faire.

Des suggestions?

+0

Votre mécanisme de mise à jour est-il un script PHP exécuté par cron? –

+0

Oui, c'est un script PHP + mySQL. – Yeti

Répondre

2

Vous pouvez utiliser un système rouge/noir (comme pour la gestion de cluster). Fondamentalement, toutes vos lignes commencent en noir.? Lorsque vous exécutez votre cron, il marque les lignes qu'il a mises à jour en tant que "Rouge". Une fois que toutes les lignes sont rouges, vous changez, et maintenant commencer à tourner toutes les lignes rouges pour être noir. Vous maintenez cette alternance, et cela devrait vous permettre de marquer efficacement les lignes afin de ne pas les mettre à jour deux fois. (Vous pouvez stocker n'importe quel objectif de couleur dans un fichier ou quelque chose de sorte qu'il est partagé entre crons)

+0

Je veux faire ceci sans aucun fichier supplémentaire car il pourrait y avoir potentiellement des dizaines du même script PHP en cours d'exécution - seule la variable N va changer dans chaque tâche cron. – Yeti

+0

Vous souhaitez que plusieurs scripts modifient le même ensemble de données simultanément? –

+0

Non, chaque travail cron mettra à jour les enregistrements dans une plage. Dans mon tableau actuel, chaque cron traitera des dossiers d'une année particulière. Il y aura donc 5 crons qui traiteront des records pour l'année 2000, 01,02,03,04 et 05 respectivement. – Yeti

0

Je voudrais simplement exécuter le script PHP toutes les 10/5 minutes avec cron, puis utiliser les fonctions de date et heure de PHP pour effectuer le reste de la logique. Si vous ne pouvez pas le chronométrer, vous pouvez stocker une variable de marquage de position dans un petit fichier.

Questions connexes