web-dev-qa-db-ja.com

Magentoでcronをテストするにはどうすればよいですか?

最初に、Magento cronがどのように機能するかを理解する必要があります。

crontab -eを使用して、Linuxでcronがどのように機能するかを知っています。
定期的に実行するようにMagentoのcron.phpを設定する必要があることを知っています

しかし、magento構成ファイル内でcronを定義すると、実行する必要があることとどのように一致しますか?

私のcron.phpを15分ごとに実行するように設定すると(0,15,30,45 * * * *)、たとえばMagento cron <schedule><cron_expr>10 * * * *</cron_expr></schedule>があるためです。

どのように一致/機能しますか?

ちなみに、私のcronが長い間待たずに動作することをどのようにテストできますか?

21
ÉricP

Magentoのcronエントリポイントは、Magentoルートのcron.phpスクリプトです。 OSのcrontabエントリを設定する必要があります。このスクリプトは、すでに実行しているようです。

cronのしくみ

cron.phpスクリプトがヒットするたびに、3つのことが起こります。

  • Schedule:Magentoはマージされたconfig.xmlファイルを解析して<config><crontab>...</crontab></config>jobsエントリを探し、それらのcron_expr要素を読み取って、実行頻度の詳細を確認します。次に、Magentoはcronスケジュールテーブルに、将来実行する必要があるジョブと、実行する必要がある場合のタイムスタンプを設定します。 Magentoがこれを行う将来の範囲は、管理者が設定できます。
  • Execute:Magentoは、このすぐに実行する必要があるジョブと、すでに実行されているはずのジョブ、つまりタイムスタンプが過去、有効期限が切れていません。有効期限も、管理者が構成できるパラメータです。
  • Cleanup:Magentoは、スケジュールテーブルを通過して、完了した、または(期限のために)実行されなかったジョブを削除します。

重複して実行されますか?

あなたは興味深い点を上げます。 Magentoで10分のcronがスケジュールされているが、cron.phpが15分ごとにヒットすることが保証されている場合はどうなりますか。 MagentoはMagentoジョブを2回実行するようです。

  • HH:00-> HH:50およびHH:00
  • HH:15-> HH:10
  • HH:30-> HH:20およびHH:30
  • HH:45-> HH:40

私はコードを読んだだけで、それが起こっているようです。見つけるための最良の方法は、もちろん、それを実行して調べることです。この問題を回避する場合は、ほとんどの場合、cron.phpの実行頻度を5分ごとに増やします。これは、私たちが行っていることです。

コードのテスト

経過時間を待たずに実際にcronが機能しているかどうかをテストする場合は、cron_exprを毎分実行するように設定するか、cronスケジュールテーブルをクリアしてから、cron.phpを2回押します(スケジュールを生成してから、ジョブを実行します)。

モデルが機能していることをテストするだけの場合は、テストスクリプト( https://www.nicksays.co.uk/testing-magento-modules に概要が示されている)を設定して実行できます。 。

あなたの質問がブログ投稿を促しました: https://www.nicksays.co.uk/dissecting-the-magento-cron-system :)

54
Nick

これらをcron.phpの下部に追加すると、実行時に日時でcron.php.logが書き出されます。

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

あなたの質問の後半で...それが実行されているかどうかを確認する方法。

これが私がしたことです。 cron.phpファイルの最後に次のコードを追加しました。これにより、cron.phpファイルが呼び出されるたびに、「cronlog.txt」という単純なログが更新されます。

そのため、cronの実行について疑問がある場合は、そのファイルを一瞥して、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

Cronが動作しているかどうかをテストするには、cron.phpファイルの最後にMage::log('cron working', null, 'cron.log');と書くだけです。

Cronが機能している場合は、ベースディレクトリにcron.logファイルが作成されます。

3
rbncha

GNU/Linuxを使用している場合は、/var/log/syslogを確認し、grepを使用してcronjobsを除外できます。実行されたすべてのcronjobsのリストを表示するには、grep 'cron' /var/log/syslogと入力します。

3
Rudolf Olah