web-dev-qa-db-fra.com

Comment tester cron avec Magento?

J'ai d'abord besoin de comprendre comment fonctionne Cron Magento.

Je sais comment cron fonctionne sur linux, en utilisant crontab -e.
Je sais que je dois configurer cron.php de Magento pour qu'il s'exécute périodiquement

Mais quand je définis cron dans le fichier de configuration magento, comment correspondent-ils à ce qu'ils doivent être exécutés?

Parce que si mon cron.php s'exécute toutes les 15 min (0,15,30,45 * * * *) et j'ai un cron Magento <schedule><cron_expr>10 * * * *</cron_expr></schedule> par exemple.

Comment cela va-t-il correspondre/fonctionner?

Au fait, comment pourrais-je tester que mon cron fonctionne sans attendre longtemps?

21
ÉricP

Le point d'entrée cron de Magento est le script cron.php Dans votre racine Magento. Vous devrez configurer une entrée de crontab OS frappé ce script, ce que vous semblez avoir déjà fait.

Fonctionnement du cron

Chaque fois que le script cron.php Est lancé, trois choses se produisent:

  • Planification : Magento analyse les fichiers config.xml Fusionnés pour <config><crontab>...</crontab></config>jobs entrées, lisant leurs cron_expr Pour plus de détails sur la fréquence à laquelle ils doivent être exécutés. Magento remplit ensuite la table de planification cron avec des travaux qui devraient être exécutés à l'avenir, ainsi que des horodatages pour leur exécution. La mesure dans laquelle Magento le fait à l'avenir est configurable dans l'administrateur.
  • Execute : Magento lit le tableau de planification cron pour les travaux qui doivent être exécutés cette seconde et les travaux qui auraient déjà dû être exécutés, c'est-à-dire avec des horodatages dans le passé, qui n'ont pas expiré. La limite d'expiration est également un paramètre configurable dans l'administrateur.
  • Nettoyage : Magento parcourt le tableau de planification en supprimant les travaux terminés ou manqués (en raison de la date limite).

Exécutions en double?

Vous soulevez un point intéressant. Que se passe-t-il si vous avez un cron de 10 minutes programmé dans Magento, mais que cron.php Est garanti d'être atteint toutes les 15 minutes. Il semble que Magento exécuterait vos tâches Magento deux fois, dans certains cas:

  • HH: 00 -> HH: 50 et HH: 00
  • HH: 15 -> HH: 10
  • HH: 30 -> HH: 20 et HH: 30
  • HH: 45 -> HH: 40

Je n'ai lu que le code, et c'est ce qui semble se produire. La meilleure façon de le savoir serait, bien sûr, de l'exécuter et de le découvrir. Si vous voulez éviter le problème, dans la plupart des cas, augmentez la fréquence d'exécution de cron.php À toutes les 5 minutes, ce que nous faisons.

Test de votre code

Si vous souhaitez tester si votre cron fonctionne réellement sans attendre un certain âge, définissez le cron_expr Pour qu'il s'exécute toutes les minutes, ou effacez votre tableau de programmation cron, puis appuyez deux fois sur cron.php (Une fois pour générer le et à nouveau pour exécuter le travail).

Si vous voulez simplement tester que votre modèle fonctionne, vous pouvez configurer un script de test (décrit dans https://www.nicksays.co.uk/testing-magento-modules ), et l'exécuter .

Votre question a incité un article de blog: https://www.nicksays.co.uk/dissecting-the-magento-cron-system :)

54
Nick

l'ajout de ceux-ci au bas de cron.php le fera écrire cron.php.log lors de l'exécution avec le datetime

try {
    Mage::getConfig()->init()->loadEventObservers('crontab');
    Mage::app()->addEventArea('crontab');
    Mage::dispatchEvent('default');

$log = fopen(__FILE__.'.log', 'a');
fwrite($log, date("Y-m-d H:i:s").PHP_EOL);
fclose($log);
} catch (Exception $e) {
    Mage::printException($e);
}
8
Max Hodges

Sur la deuxième moitié de votre question ... comment savoir si son fonctionnement.

Voici quelque chose que j'ai fait. J'ai ajouté le code suivant à la fin du fichier cron.php. Cela met à jour un journal simple appelé "cronlog.txt" chaque fois que le fichier cron.php est appelé.

Donc, si j'ai des doutes sur l'exécution de cron, je peux simplement jeter un coup d'œil à ce fichier et voir la dernière date et heure d'exécution du fichier cron.php.

try {
   $myFile = "cronlog.txt";
   $fh = fopen($myFile, 'w');
   $stringData = date('l jS \of F Y h:i:s A');
   fwrite($fh, $stringData);
   fclose($fh);
} catch (Exception $e) {
   Mage::printException($e);
}
7
RThomas

Pour tester le fonctionnement de cron ou non, vous pouvez simplement écrire Mage::log('cron working', null, 'cron.log'); à la fin du fichier cron.php.

Si le cron fonctionne, il créera un fichier cron.log dans votre répertoire de base.

3
rbncha

Si vous êtes sous GNU/Linux, vous pouvez vérifier /var/log/syslog et filtrez les tâches cron en utilisant grep. Pour afficher la liste de tous les cronjobs exécutés, saisissez grep 'cron' /var/log/syslog.

3
Rudolf Olah