私は、設定された時間に1日1回実行するCronジョブを設定するのが難しいです。ここで私は私のモジュールのconfigに持っているものだ:私はcronジョブについて知っている、それは私のローカルタイムゾーンに基づいて、午後5時に実行する必要がありますMagentoのCronは根本的に欠陥がありますか?
<crontab>
<jobs>
<sorting_flushcache>
<schedule><cron_expr>0 16 * * *</cron_expr></schedule>
<run><model>sorting/observer::flushProductCacheCron</model></run>
</sorting_flushcache>
</jobs>
</crontab>
から。しかし、決して動作しません。代わりにcron_exprを* 16 * * *
に設定すると、1時間ごとに1分ごとにジョブがスケジュールされます(予想どおり)。
私は、コードを追跡し、私は問題を発見したが、私はcronのスケジュールについて十分に知っていないとどのようにこれは私が誰かが私が間違っているかを理解することができます願って、どのようにしています動作するようになっ本当にだと思います私の仕事を働かせる。
Mage_Cron_Model_Scheduleは、獣の頭脳です。 cron.phpスクリプトがサーバーのcrontabスケジュールによって呼び出されると、このクラスがキャッチしてその処理を行うイベントを送出します。とりわけ、これは設定を取り込み、次のcronジョブをスケジュールしようとします。 public function trySchedule($time)
の内部ではmatchCronExpression
が呼び出され、問題のcron式の部分と、そのcron式の部分に対応する現在の時刻の値が渡されます。たとえば、cron_expr(分部分)の最初の部分と現在のタイムスタンプの分を比較します。 matchCronExpression
機能の終わりに、それはそうのようなブール値を返します。私の場合は
return ($num>=$from) && ($num<=$to) && ($num%$mod===0);
を、私のcron_exprは0 16 * * *
です。 分部分には範囲または*/5
タイプのものがないため、設定した正確な値と現在のタイムスタンプの正確な値を比較しています。つまり、このジョブをスケジュールする正確な時間にcronスクリプトを実行した場合にのみtrueを返します。
また、私はクロンの専門家ではありませんが、これは私にとって正しいようには見えません。 cronスケジューラがスクリプトを実行する正確な時間を予測できない場合、1日に1回実行するジョブをスケジュールする方法はありますか?私は本当に何かが欠けていることを願っています。
- CRON CONFIG INFO -
generate schedules every: 5
schedule ahead for: 10
missed if not run within: 20
success history lifetime: 60
failure history lifetime: 600
サーバーのタイムゾーンではなく、ローカルのタイムゾーンです。 – hakre
何でも、それはポイントではありません。私が私の記事で述べたように、もしそれを '* 16 * * * 'に変更すれば、それは機能します。だから私はそれが私がそれを基礎にしていると言ったセマンティクスではありません。私は単に動作しません。 – BrianVPS
うんざりしているようです。しかし、私が読んだところでは、マグネトのコード品質は良くありません。おそらくちょうど一緒にshitbackedリリースをプッシュし、それはセクシーに見えるように急いで販売される。 – hakre