純規の暇人趣味ブログ

首を突っ込んで足を洗う

PHPでMojangサーバの状態を取得する

      2016/02/20    HimaJyun

みなさん、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サーバの状態を取得する

 - Web制作 ,