PHPでMojangサーバの状態を取得する
2018/03/26
みなさん、Minecraftのマルチサーバに接続しようとした時に
「現在、認証サーバがメンテナンス中です。」と言うエラーが出て接続出来ない事はありませんか?
これはMojangSupportから確認出来るのですが、どうせなら自分のサイトに掲載したいです。
なので、この「認証サーバ」なる物の状態をPHPで取得してみようと思います。
スポンサーリンク
さて、この「現在、認証サーバがメンテナンス中です。」状態になると、復旧が遅い事もしばしば
加えて、「普通は」どのマルチサーバにも接続出来ない。
鯖缶の方の中にはこれが理由でユーザの方から、「接続出来ないんですけど!!」
と言った怒りの問い合わせを受け取った方も居るかも知れません。
とは言われても、これはMojang鯖が悪いのであって、
自分の鯖が悪い訳では無いので、どうしようもありません。
なので、自分のホームページに掲載出来る様にしてみようと思います。
そうすれば、ユーザの方にはそこを見てもらば良い訳ですからね。
で、どうするか?
実は、Mojang鯖の状態は
http://status.mojang.com/check
のURLから、jsonと言う形式で取得が出来るのです。
実際にダウンロードしたファイルが以下の通りです。
[{"minecraft.net":"green"},{"session.minecraft.net":"green"},
{"account.mojang.com":"green"},{"auth.mojang.com":"green"},
{"skins.minecraft.net":"green"},{"authserver.mojang.com":"green"},
{"sessionserver.mojang.com":"green"},{"api.mojang.com":"green"},
{"textures.minecraft.net":"green"}]
ユニークな事に、サーバの状態は色で表されています。
正常であれば「green」
一応稼働していれば「yellow」
完全にあぼんであれば「red」
今回ダウンロードしたファイルは「green」なので全て正常です。
なので、これをPHPで判定して振り分ければ良いのです。
※Ajax版も作成してみました、こちらの方がおススメです!!→AjaxでMojangサーバの状態を取得する
実際にやってみる
と、行きたい所ですが、既にStackOverflowに投稿されて居ました。
車輪の再発明は非合理的なので、これを使ってやれば良いのですが
このままではアクセスの度にMojang鯖にリクエストするので、ページの表示速度が遅くなります。
実際に試してもらえば分かりますが、体感出来るくらいには違いがあります。
これではいけません、やはりページの表示は早いに越した事はありません。
なので、DLしたファイルをキャッシュさせる様にしてみようと思います。
改良してみた
と言っても、ダウンロードしたjsonオブジェクトをキャッシュしてるだけだけど……
<?php
//キャッシュする時間
$cacheTime = '5 minutes';
//file_exists:ファイルの存在をチェックします。
if(file_exists(__DIR__.'/cache/mojang'))
{
//読み取る
$data = unserialize(file_get_contents(__DIR__.'/cache/mojang'));
if($data['LastModify'] >= strtotime('-'.$cacheTime))
{
$data = getstatus();
}
} else {
$data = getstatus();
}
foreach($data['status'] as $address) //サーバステータスを出力
{
$server = array_keys($address)[0];
switch($address[$server]) //条件分岐
{
case 'green':
$colour[0] = '008000';
$colour[1] = '正常';
break; //グリーンは正常
case 'red':
$colour[0] = 'ff0000';
$colour[1] = 'ダウン中';
break; //レッドはダウン中
case 'yellow':
$colour[0] = 'ff9900';
$colour[1] = '稼働中';
break; //イエローは一応稼働中
default:
$colour[0] = 'ff0000';
$colour[1] = '不明';
break; //その他の時は不明
}
echo $server.'は<span style="color:#'.$colour[0].'">'.$colour[1].'</span>です。'; //出力
}
//foreach後のunsetは参照渡しの時だけで良い?
unset($address); //良く分からないのでunsetしておくと安全でしょう。
function getstatus()
{
//jsonをget!!
$json = file_get_contents("http://status.mojang.com/check");
/*
//cURLが使える場合はこちらを
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://status.mojang.com/check');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,true);
curl_setopt($ch, CURLOPT_MAXREDIRS,10);
curl_setopt($ch, CURLOPT_AUTOREFERER,true);
$json = curl_exec($ch);
curl_close($ch);
*/
$data['status'] = json_decode($json, true);
//ファイルを取得した時間を
$data['LastModify'] = strtotime('now');
//書き込む。
file_put_contents(__DIR__.'/cache/mojang', serialize($data));
return $data;
}
?>
このPHPコードをサーバにアップロードして
同じディレクトリに「cache」と言う名前のディレクトリを作成して下さい。
また、「cache」ディレクトリはサーバソフトウェア(Apacheなど)が書き込み可能なパーミッション(775など)にして下さい。
これで、取得したMojang鯖のステータスを5分間の間、キャッシュします。
キャッシュが古い時の表示速度は変わりませんが、キャッシュがある間は表示速度が早くなります。
(当たり前です、本来、ネットワーク上から取得するリソースをローカルのディスクから引っ張り出しているのですから)
もし、キャッシュする時間を変更したい方は
$cacheTime = '5 minutes';の所を変更して下さい。
strtotime関数で認識できる形であれば構いません。
これでサーバのステータスをWebサイトから確認できるようになりますね!!
ちなみに、
Ajax版もあります。(こっちの方が良かったり?)→AjaxでMojangサーバの状態を取得する