見出し画像

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分に回収、と。

リトライについては、ストアド側でカバーしてますよ?


さて、明日どうなってるかなーっと。


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

いいなと思ったら応援しよう!