MMORTBS開発記-041 時間経過処理をクーロンに登録しよう②
いつもありがとうございます。
スキマ時間開発のお時間です。よろしくお願いします。
前回までのあらすじ
インタネット怖えええぇぇぇぇぇぇ!あとクーロン設定しました。
早速設定したクーロンが動いているか確認しましょう。
バッチが動く時間を待って、データを確認すると。
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
さてどうなるか。
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 ;
最後まで読んでいただきありがとうございました。