最初に、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が長い間待たずに動作することをどのようにテストできますか?
Magentoのcronエントリポイントは、Magentoルートのcron.php
スクリプトです。 OSのcrontabエントリを設定する必要があります。このスクリプトは、すでに実行しているようです。
cronのしくみ
cron.php
スクリプトがヒットするたびに、3つのことが起こります。
config.xml
ファイルを解析して<config><crontab>...</crontab></config>
jobs
エントリを探し、それらのcron_expr
要素を読み取って、実行頻度の詳細を確認します。次に、Magentoはcronスケジュールテーブルに、将来実行する必要があるジョブと、実行する必要がある場合のタイムスタンプを設定します。 Magentoがこれを行う将来の範囲は、管理者が設定できます。重複して実行されますか?
あなたは興味深い点を上げます。 Magentoで10分のcronがスケジュールされているが、cron.php
が15分ごとにヒットすることが保証されている場合はどうなりますか。 MagentoはMagentoジョブを2回実行するようです。
私はコードを読んだだけで、それが起こっているようです。見つけるための最良の方法は、もちろん、それを実行して調べることです。この問題を回避する場合は、ほとんどの場合、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 :)
これらを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);
}
あなたの質問の後半で...それが実行されているかどうかを確認する方法。
これが私がしたことです。 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);
}
Cronが動作しているかどうかをテストするには、cron.phpファイルの最後にMage::log('cron working', null, 'cron.log');
と書くだけです。
Cronが機能している場合は、ベースディレクトリにcron.logファイルが作成されます。
GNU/Linuxを使用している場合は、/var/log/syslog
を確認し、grep
を使用してcronjobsを除外できます。実行されたすべてのcronjobsのリストを表示するには、grep 'cron' /var/log/syslog
と入力します。