ここから本文です

cronで同じphpファイルを何度も実行しようと思っているのですが、このphpは処理に...

pgb********さん

2014/1/620:01:06

cronで同じphpファイルを何度も実行しようと思っているのですが、このphpは処理に時間がかかる(数時間)ため、phpが実行されている時はcronを実行せず、php処理が終了している時はcronを実行させたいと

思っています。どのようにすればよいでしょうか?
説明が簡単ですが、宜しくお願い致します。

補足test.php(時間がかかる処理内容)をcronでセットしたとして、
test.php処理の冒頭に、/tmp/program.pid(例)というファイルがあるかを調べる処理をいれたとします。
前回の処理(test.php)がまだ終わっていない場合、/tmp/program.pidというファイルがあるかを調べにいっている間、一瞬だけ二重起動するということになりますけど、大丈夫なのしょうか?

閲覧数:
1,698
回答数:
2

違反報告

ベストアンサーに選ばれた回答

tak********さん

2014/1/620:46:20

php側に二重起動防止処理を入れたらいいんじゃないですか?

まず処理の冒頭に、/tmp/program.pid(例)というファイルがあるかを調べます(linuxでphpを利用していると仮定します)。
このファイルが有れば起動中、なければ未起動と判断します。

ない場合(未起動の場合)は、getmypid()で自分のブロセスのプロセスIDを取得し、それを/tmp/program.pidに書き込みます。
その後、メインの処理を進めます。処理完了時に必ず/tmp/program.pidを削除します。

あった場合(起動中の場合)は、/tmp/program.pidに書いてあるプロセスIDを読み込み、そのプロセスIDのプログラム(つまり前回の起動からずっと起動したままのプログラム)があるかを調べます。
これはphpのsystem()関数を使って、linuxコマンドのpsを利用するといいでしょう。
例えば"ps プロセスIDの数値 | wc -l"とすると、起動中なら数値の2、起動していなければ数値の1が戻ります。
2が返ってきたら二重起動しないようにプロセスを終了します。
1が返ってきたら、前回に起動はしたけど何らかのエラーで途中終了したとみなし、/tmp/program.pidを削除します。
あとは起動していなかった時と同じように、プロセスIDを再度/tmp/program.pidに書き込み、メイン処理を実行、/tmp/program.pidを削除します。

二重起動防止とかで検索すると、いろいろな方法が出てきますので参考にしてください。
http://blog.xlune.com/2007/11/php_pid.html

質問した人からのコメント

2014/1/11 13:30:30

ありがとうございます!!解決いたしました!!

ベストアンサー以外の回答

1〜1件/1件中

プロフィール画像

カテゴリマスター

ryo********さん

編集あり2014/1/622:55:47

cronで定期実行させずに、1回のPHP実行を無限ループさせるという発想ではどうでしょう?time_sleep_untilという便利な関数もありますので活用してください。但し、リソースを使う場合は必ず最後に解放する(fclose、pcloseなど)ようにしないと、いつかメモリーリークが発生するのでご注意を。

time_sleep_until
http://php.net/manual/ja/function.time-sleep-until.php


例:「cronを6時間間隔で実行する、但し前回の処理がまだ続いていれば終了まで待ち更に3分間待って実行する」と等価(@演算子で手抜きしてます)

<?php
set_time_limit(0);
while (true) {
if (!@time_sleep_until($next)) { sleep(180); }
$next = time() + 21600;
very_long_processing();
}

あわせて知りたい

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる