2012-04-19 16 views
5

私は、設定された時間に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_expr0 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 
+0

サーバーのタイムゾーンではなく、ローカルのタイムゾーンです。 – hakre

+0

何でも、それはポイントではありません。私が私の記事で述べたように、もしそれを '* 16 * * * 'に変更すれば、それは機能します。だから私はそれが私がそれを基礎にしていると言ったセマンティクスではありません。私は単に動作しません。 – BrianVPS

+0

うんざりしているようです。しかし、私が読んだところでは、マグネトのコード品質は良くありません。おそらくちょうど一緒にshitbackedリリースをプッシュし、それはセクシーに見えるように急いで販売される。 – hakre

答えて

3

私はこの問題の「解決策」を発見したかもしれないが、私はこれを持っている可能性のある影響はわかりません。うまくいけば、他の誰かがチャイムでより良い答えを確認したり提供することができます。

次のように私は、Magentoの中で私のクロンコンフィグを変更:

generate schedules every: 1 
schedule ahead for: 5 
missed if not run within: 20 
history cleanup every: 30 
success history lifetime: 60 
failure history lifetime: 600 

これはトリックを行っているようです。これで毎分スケジュールが生成されるので、1日1回のイベントをスケジュールするウィンドウが表示されません。

これについてのご意見はありますか?システムが毎分cronスケジュールを生成するのは大変だと私は懸念しています。それを処理できるはずですが、確認するためにテストを行う必要があります。

他にみんな同様の経験がありますか?どのように解決しましたか?

+0

これは、エントリがcron_scheduleテーブルに表示されるようになっていますが、コードが正しく実行されていません。私のモデルでは、cronによって呼び出されるメソッドは** flushProductCacheCron **です。それが実行された後、私はDBをチェックし、処理を必要とする項目を処理したことを反映するためにテーブルを更新しましたが、実際にキャッシュをフラッシュしませんでした。 cronジョブで実行できるコードには制限がありますか?テストするには、フロントエンドコントローラをセットアップして、cronによって呼び出された同じメソッドを呼び出します。そのURLを読み込むと正しく動作します。 cronだけが問題を抱えています。何が起きてる? – BrianVPS

関連する問題