見出し画像

MMORTBS開発記-041 時間経過処理をクーロンに登録しよう②

いつもありがとうございます。

スキマ時間開発のお時間です。よろしくお願いします。

前回までのあらすじ

  インタネット怖えええぇぇぇぇぇぇ!あとクーロン設定しました。



早速設定したクーロンが動いているか確認しましょう。

クローンは多分動いている。けど、3時間分を一気に処理している。なぜだ。


バッチが動く時間を待って、データを確認すると。

ん?

5/1の3:夜の後、5/2の3:夜になっとる。

んー。。。。

あぁOK、大丈夫。全て理解した。だいぶ前に書いたSQLだネ。忘れてたわ。

-- 105.ゲーム時間帯取得
delimiter //
CREATE OR REPLACE FUNCTION xxxxxxx (x_datetime DATETIME)
RETURNS VARCHAR(10) DETERMINISTIC
BEGIN 
 DECLARE p_ret VARCHAR(10);
 DECLARE p_hour TIME;
 
 -- 引数NULLの場合、エラー
 IF x_datetime IS NULL THEN RETURN '引数NULLはNG' ; END IF;
 
 -- 時間要素を取得
 SET p_hour = HOUR(TIME(x_datetime)) ;
 IF p_hour <= 4 THEN SET p_ret = '3'; -- 夜
 ELSEIF p_hour <= 12 THEN SET p_ret = '1'; -- 午前
 ELSEIF p_hour <= 20 THEN SET p_ret = '2'; -- 午後
 ELSE SET p_ret = '3'; -- 夜
 END IF;
 
 RETURN p_ret;
end
//
delimiter ;

凝り過ぎだ、去年(または一昨年)のワタシ。阿呆め。

完全に、日付が変わったら次は1:朝だ、と思い込んでたわ。



さっさと修正。

-- 105.ゲーム時間帯取得
delimiter //
CREATE OR REPLACE FUNCTION xxxxxxxx (x_datetime DATETIME)
RETURNS VARCHAR(10) DETERMINISTIC
BEGIN 
 DECLARE p_ret VARCHAR(10);
 DECLARE p_hour TIME;
 
 -- 引数NULLの場合、エラー
 IF x_datetime IS NULL THEN RETURN '引数NULLはNG' ; END IF;
 
 -- 時間要素を取得
 SET p_hour = HOUR(TIME(x_datetime)) ;
 IF p_hour <= 8 THEN SET p_ret = '1'; -- 朝
 ELSEIF p_hour <= 16 THEN SET p_ret = '2'; -- 昼
 ELSE SET p_ret = '3'; -- 夜
 END IF;
 
 RETURN p_ret;
end
//
delimiter ;

さて、ログは、と。


約一時間だけどなんか安定しない?

5分が切り替わるタイミングだっけ。。。

とりあえず0分と30分に変更。

あかんね。

うん。30分後に回収とかヌルいこと言ってちゃだめですね。

素直に排他制御入れて5分間隔にしましょう。

 -- 排他制御
 IF p_ins_class = 'updating' THEN
  LEAVE root;
 ELSE
  UPDATE `サーバのステータス管理用に1行登録されているテーブルだよ!`
   SET ins_class = 'updating'
     , upd_dt = NOW()
     , upd_class = 'xxxxxxx'
   WHERE 1 = 1;
 END IF;
 ・
 ・
 ・
 ・
 UPDATE `サーバのステータス管理用に1行登録されているテーブルだよ!`
  SET ins_class = ''
    , upd_dt = NOW()
    , upd_class = 'xxxxxxx'
  WHERE 1 = 1;

今更に列追加をしたくないテーブルなので、惰性で作成していた未使用列を使います。(設計はだいじですね。)

良い子はマネしちゃダメですよー。
テーブルに列追加できないなら、新しく制御用にテーブルを作成するのが素直でよいと思います。


cornは5分間隔。

*/5 * * * * /usr/bin/php /xxxxxxxxxxxxxxxxx.php


さてどうなるか。



0,10,10で法則性あり。というか朝が10分早い。上記のストアドの問題か。。。


N時台って考えると。時間帯の区分けはこう。

んで実装がこう。

馬鹿発見。幼稚園からやり直せ数日前のワタシ。


コウダネ。

-- 105.ゲーム時間帯取得
delimiter //
CREATE OR REPLACE FUNCTION xxxxxxxx (x_datetime DATETIME)
RETURNS VARCHAR(10) DETERMINISTIC
BEGIN 
 DECLARE p_ret VARCHAR(10);
 DECLARE p_hour TIME;
 
 -- 引数NULLの場合、エラー
 IF x_datetime IS NULL THEN RETURN '引数NULLはNG' ; END IF;
 
 -- 時間要素を取得
 SET p_hour = HOUR(TIME(x_datetime)) ;
 IF p_hour < 8 THEN SET p_ret = '1'; -- 朝
 ELSEIF p_hour < 16 THEN SET p_ret = '2'; -- 昼
 ELSE SET p_ret = '3'; -- 夜
 END IF;
 
 RETURN p_ret;
end
//
delimiter ;




最後まで読んでいただきありがとうございました。





この記事が気に入ったらサポートをしてみませんか?