LoginSignup
0
0

More than 5 years have passed since last update.

PHPでtime_sleep_untilをEC2で使ったら秒単位で狂って辛い

Posted at

1分以下の定期実行にPHPのtime_sleep_untilを使った

LinuxのCRONを使えば、年月日時分単位で自動的にコマンドを実行可能です。
ただ、Dockerのコンテナ上では面倒だったり、1分以下の設定が出来なかったりとちょっと不便に思う時もあります。

そこで、PHPのtime_sleep_untilを使えば、○○時○○分○○秒までスリープするというタイムスタンプを指定したスリープ処理が可能です。

サンプルコード

demo_time_sleep_until
<?php
while(true){
    $next_time_stamp = time()+(60);
    echo exec("date");
    sleep(45);
    time_sleep_until( $next_time_stamp );
}
?>

 3行目$next_time_stamp = time()+(60);で次の実行時刻を指定しています。60秒毎に実行するように、現在時刻+60をしています。5行目sleep(45);は、何らかの時間がかかる処理を実行したことをシミュレートするためです。
 6行目のtime_sleep_until( $next_time_stamp );で3行目に指定した時刻までスリープするように設定します。

実行結果

2016年  5月  1日 日曜日 06:44:20 JST
2016年  5月  1日 日曜日 06:45:20 JST
2016年  5月  1日 日曜日 06:46:19 JST
2016年  5月  1日 日曜日 06:47:18 JST
2016年  5月  1日 日曜日 06:48:17 JST
2016年  5月  1日 日曜日 06:49:16 JST

1回のループで1秒程度早まっている事が観察されました。
MacBook Proで試した時には、早まったりすることは無かったのですが。。。。

実行環境

  • インスタンス EC2 Amazon Linux
  • PHP 5.3.29 (cli) (built: May 12 2015 22:42:19)

まとめ

time_sleep_untilを使う場合には、実行環境によって動作が異なるので、お気をつけ下さい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0