MMORTBS開発記-040 時間経過処理をクーロンに登録しよう①
いつもありがとうございます。
スキマ時間開発のお時間です。よろしくお願いします。
前回までのあらすじ
時間経過処理のストアドの行数が膨大になってきたぞ。
時間経過処理は本作のメインどころなので、オープンベータ中も追記しつづけ、なんなら本番後もしばらくは増え続けると思われるものの、とりあえずダンジョン攻略に関連する部分は7割がた書けました。
というわけで、早速クーロンに登録していこうと思います。
Last failed login: Sun Mar 27 23:33:44 JST 2022 from XXX.XXX.XXX.XXX on ssh:notty
There were 319923 failed login attempts since the last successful login.
Last login: Thu Nov 25 21:17:40 2021 from XXXXX.ne.jp
__ ____ _______ ___ _ _____ __________
/ //_/ / / / ___// | / | / / | / ____/ _/
/ ,< / / / /\__ \/ /| | / |/ / /| |/ / __ / /
/ /| / /_/ /___/ / ___ |/ /| / ___ / /_/ // /
/_/ |_\____//____/_/ |_/_/ |_/_/ |_\____/___/
Version 8.5.2-2, Powered by Prime Strategy.
================================================
Welcome KUSANAGI Manager application!
ログインするのも久しぶりですね。
Last login: Thu Nov 25 21:17:40 2021 ですか。ふむ。。。。む???
There were 319923 failed login attempts since the last successful login.
インターネット怖えぇぇぇぇぇぇ!!!!!!
攻性防壁とか欲しいですねぇ。(KUSANAGIだけに)
気を取り直して、クーロンを設定していきます。
というか、そもそもデフォルトってなんか設定されてるんかね?
# crontab -l
#Ansible: Update KUSANAGI manager
0 2 * * * sleep $(expr $RANDOM \% 3600) && /opt/kusanagi-manager/update-kusanagi-manager.sh >> /var/log/kusanagiupdate.log 2>&1
07 03 * * 0 /usr/bin/kusanagi update cert
あぁ。KUSANAGIの更新確認か。
さてクーロンの設定です。
SQLの呼び出しはここまで全てPHPから行っているので、今回もPHPで呼びましょう。
ただし、cronでPHPを呼ぶ場合、引数の設定が面倒臭そう。
面倒くさいなら引数なんてなくてイイじゃない!
ということで、汎用プロシージャ実行PHPファイルを改造します。
汎用はこんな感じ。
多分過去に張り付けていたコードから、若干アップデートされているはず。
<?php
require_once 'xxxxxx';
$table = '';
// URL引数からプロシージャ名を取得
if(isset($_GET['prc'])) {
$prc = $_GET['prc'];
$sql = "CALL ".$prc."(";
}
// URL引数からテーブル名を取得
if(isset($_GET['table'])) {
$table = $_GET['table'];
}
// URL引数からOUTを取得
$ret = '';
if(isset($_GET['ret'])) {
$ret = $_GET['ret'];
}
$no = 0;
// 引数の数だけループ
foreach($_REQUEST as $query => $value){
// prcは読み飛ばす
if($query == 'prc') continue;
// verも読み飛ばす
if($query == 'ver') continue;
// tableも読み飛ばす
if($query == 'table') continue;
// 最初のみ、区切り文字不要
if ($no !== 0){
$sql .= ",";
}
// 引数が設定されている場合、設定されている順に設定する
$sql .= (isset($value)) ? $value : '';
$no++;
}
$sql .= ")";
// SQLステートメントを実行し、結果を変数に格納
$stmt = null;
$stmt = $dbh->query($sql);
// デバッグ用
// echo $sql;
// exit;
// 連想配列のみ出力するモード(数値は不要)
if (!is_null($stmt)){
$stmt->setFetchMode(PDO::FETCH_ASSOC);
}
$return = '0';
// 戻り値が設定されていた場合、戻り値を確認する
if($ret !== ''){
$sql2 = "SELECT ".$ret;
$stmt2 = $dbh->query($sql2);
foreach ($stmt2 as $row) {
$return = $row[$ret];
}
}
// 戻り値が0以外の場合、エラーログを登録し、戻り値を返して処理終了
if($return != '0'){
$logsql = "INSERT INTO log_err VALUES ('".date("Y/m/d H:i:s")."', 'callprc', '".str_replace("'", "’", $sql)."', '".$return."' )" ;
$dbh->query($logsql);
echo $return;
// エラーが発生していない場合はデータテーブルを返す
}else if($table !== ''){
// データセットをjsonに変換
echo '{"'.$table.'":{';
$no = 0;
foreach ($stmt as $row) {
// 最初のみ、区切り文字不要
if ($no !== 0){
echo ',';
}
// JSONにして出力
echo '"'.$no.'":';
echo json_encode($row,JSON_UNESCAPED_UNICODE);
$no++;
}
echo '}}';
}
?>
んで、時間経過処理ストアドの引数は固定で書けるので、このコードの引数引っ張ってきている箇所をツブせばOK。
さくっと修正して、じゃあ実行していきましょう。
タイムアウトはキャッチしてないからエラーログも吐かれてない。
やーな感じ。
とはいえストアドは蹴ってるので、DBを確認したら処理は完了している。
SQLのタイムアウトではなくて、httpsのタイムアウトかー。。。
cronから起動するモノなので、いいのか???
個人でやってると、このあたりの知見が足りないんよなー。
とりあえず設定して様子見。
#WE
5,35 * * * * /usr/bin/php /xxxxxxxx.php
1時間ごとの処理なので、毎時5分に実行。
なんかでシクった場合に35分に回収、と。
リトライについては、ストアド側でカバーしてますよ?
さて、明日どうなってるかなーっと。
最後まで読んでいただきありがとうございました。