2017-04-09 7 views
1

これに問題がありますか?私は正確に真夜中Yesterdays正確な真夜中の日付をPHPで取得する

0 0 * * * /usr/bin/php myscript.php 

でcronジョブを設定しています

スクリプトは、MySQLのタイムスタンプ形式で前日の日付を定義するために設定されています。

$midnightyesterday2 = (new DateTime())->setTime(0, 0); 
$midnightyesterday2->modify('-1 day'); 
$midnightyesterday = $midnightyesterday2->format("Y-m-d H:i:s"); 

エコー出力:

2017年4月8日午前0時00分○○秒

$endofdayyesterday2 = (new DateTime())->setTime(23, 59, 59); 
$endofdayyesterday2->modify('-1 day'); 
$endofdayyesterday = $endofdayyesterday2->format("Y-m-d H:i:s"); 

エコー出力:

2017年4月8日23時59分59秒

私は夜03時22分00秒でこれをやっているので、明らかに、このサンプル出力は正常に動作しています。

真夜中にクローンジョブを設定すると、何らかの理由でスクリプトが早い段階で早く実行されても、半分の時間でも競合が発生する可能性があります。

正確に真夜中に実行するようにスクリプトを設定して、yesterdaysの日付を確実にする良い方法はありますか?

私のエコーが示すように、スクリプトがMySQL lastmodifiedタイムスタンプに基づいており、12:01にそれを実行しても、その分に追加の行が残ってしまう可能性があるため、正確に真夜中に実行する必要があります。スクリプトが正確に深夜(0時00分00秒)で動作するように設定されている、

は覚えておいてください:

+0

あなたのうまくいけば、あなたのcronの仕事は一度だけ実行され、深夜には、あなたはそれについて全く心配する必要はありません。しかし、真夜中でもいつでも、それは一度だけ実行されます。 –

+1

システムを真夜中に稼働しているジョブに依存させるのは本当に危険です。あなたはあなたの目標を達成する別の方法を考えるべきです。 –

+0

@ Evan Carslake:うまくいきませんが、それは一度だけ実行されることはわかっていますが、私の心配は、深夜に実行されているため、DateTimeが壊れて重複する可能性があります。 @Gordon Linoff:したがってこの質問:DateTimeに12時間を追加し、時間を00:00:00に設定するか、より良い方法があるかどうかを尋ねるのですか? –

答えて

0

私のソリューション(コメント欄に私のところに来たのようなもの)は、次の操作を行うことでした。

私は新しいDateTimeオブジェクトを設定して12時間を追加しています。 (午前12時00分00秒)

次に00:00:00に時間を設定するsetTimeを使用して、12時間先にそれを移動した後。

は、その後24時間を減算するために、再度のDateTimeのmodifyを使用します。

$midnightyesterday2 = new DateTime(); 
$midnightyesterday2->modify('+12 hour'); 
$midnightyesterday2->setTime(0, 0); 
$midnightyesterday2->modify('-24 hour'); 
$midnightyesterday = $midnightyesterday2->format("Y-m-d H:i:s"); 
echo $midnightyesterday; 

2017年4月8日午後12時00分00秒

$endofdayyesterday2 = new DateTime(); 
$endofdayyesterday2->modify('+12 hour'); 
$endofdayyesterday2->setTime(23, 59, 59); 
$endofdayyesterday2->modify('-24 hour'); 
$endofdayyesterday = $endofdayyesterday2->format("Y-m-d H:i:s"); 
echo $endofdayyesterday; 

を引き起こす昨日一日の終わりを取得すると同じ2017-04-08 23:59:59

私はこれを行う最良の方法だとは言いませんが、このアイデアはちょうど私に来ました。しかし、それは多分私がしようとしているものにフェイルセーフの一種を追加するようだ。

誰かがより適切で適切な解決策を持っている場合は、しばらくこのままにしておきます。

関連する問題