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を使う場合には、実行環境によって動作が異なるので、お気をつけ下さい。