- 締切済み
5分毎にDBに追加しているのですが・・・
Activeperl,postgresqlです。 17時まで5分毎にあるページから値を取得しDBに追加しているのですが、まれに追加できていない場合があります。 ------DB------ 時間 値 16:00 180 16:05 190 16:15 205 -------------- この場合は16:10が抜けています。 追加出来ていない時間はランダムでエラーも出ません。 ちなみにソースです。 while ($hour < 17) { 時間を取得 if ($min % 5 == 0 && $min_old != $min){ 値を取得しDB追加 DBに追加されているかチェックし 追加されていない場合は追加 $min_old = $min; } } なぜ抜けてしまうしょうか?? 確実に5分毎に追加する方法をご教授下さい。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- moon_night
- ベストアンサー率32% (598/1831)
> 分が5で割り切れる時、あるホームページにアクセスし値を取得しDBに追加しています。アクセスがあった場合ではありません。 > ちなみに値を取得する時間を計測したのですが2・3秒でした。 動作時間の話ではなく、動作するときのトリガの話です。 要するに、そのプログラムが動作する条件の話です。 (1)誰かがCGIにアクセス ↓ (2)時間を調べ、5で割り切れる分ならば取得スタート(トリガ) ↓ (3)DBに書きこみ というふうにしているのではないでしょうか? という意味の回答です。 (1)のようにしている場合、5で割り切れる分数にアクセスがなかったら情報は取得されませんよね? > if(){~}の処理も「値を取得」を10秒毎に実行しているだけなので1分もかからない筈なのですが・・・ これはどのような意味でしょうか? スクリプトを10秒毎に走らせているのでしょうか?
- thatsthat
- ベストアンサー率55% (15/27)
原因はno1さんのおっしゃる通りではないかと思います。 16:10:00~16:10:59の間に「時間を取得」を通らなければ、 16:10に期待していた動作はしてくれませんね。 16:05分の処理が5分以上かかっていたり、 あるいはif(){~}の外の部分にも 1分かかりうる処理(sleep 60など)があったりすると そうなります。 if(){}内の処理に5分以上かかる事があるのなら、 まずそこをなんとかしなければ、 5分おきという仕様自体ムリという事になりますが そうでなければ、if(){}の条件を例えば if(int($min/5)!=$min_old){ ~ $min_old=int($min/5); } こんな感じならば4分までのズレは吸収できると思います。 (use integerしてあるならint()は不要です。) windowsの場合にunixのcornのような事をやるには、 atコマンド(タスクスケジューラ)では5分おきの設定はできなかったハズなので、 何かしらのツールを使う必要があります。 「windows cron」で検索すればたくさん出てくると思います。
- moon_night
- ベストアンサー率32% (598/1831)
よく分かりませんが、分数が5で割り切れる場合の時間にアクセスがあった場合に更新するというものでしょうか? その場間と、指定の一分間アクセスがない場合は更新されないと思いますが・・・ サーバがLinuxなどでしたらcronを使用したほうがいいと思います。
補足
回答有難うございます。 >よく分かりませんが、分数が5で割り切れる場合の時間にアクセスがあった場合に更新するというものでしょうか? 分が5で割り切れる時、あるホームページにアクセスし値を取得しDBに追加しています。アクセスがあった場合ではありません。 ちなみに値を取得する時間を計測したのですが2・3秒でした。 質問がへたくそでごめんなさい。
補足
回答有難うございます。 >16:10:00~16:10:59の間に「時間を取得」を通らなければ、 >16:10に期待していた動作はしてくれませんね。 >16:05分の処理が5分以上かかっていたり、 >あるいはif(){~}の外の部分にも >1分かかりうる処理(sleep 60など)があったりすると >そうなります。 値を取得する時間を計測したのですが2・3秒でした。 if(){~}の処理も「値を取得」を10秒毎に実行しているだけなので1分もかからない筈なのですが・・・ 「値を取得」の処理はエラー処理していない為、エラーになると落ちますのでこちらはおそらく問題ないと思います。 うーん、難しいです・・・