【PHP】データベース不要!JSONファイルだけで作る簡易ランキングシステムの作り方
個人でゲームサイトを作るとき、一番面倒なのが「データベース(MySQLなど)」の準備ではないでしょうか?
「サーバー代を安く抑えたい」「SQLの知識がない」…そんな悩みを持つ方へ。
当サイト(Play Spot)で実際に稼働している、「JSONファイルのみで管理する超軽量ランキングシステム」の仕組みを公開します。
📂 仕組み:テキストファイルに保存するだけ
大掛かりなDBサーバーは使いません。
`ranking_data.json` というテキストファイルを用意し、そこに全員分のスコアを書き込んでいくだけです。
アクセス数が月間数万PV程度までなら、この方法で全く問題なく動作します。
💻 ソースコード解説
1. データの保存(書き込み)
新しいスコアが送られてきたら、一度ファイルを全て読み込み、配列に追加して、また保存します。
同時に `file_lock` を使うことで、同時に書き込みが起きてもデータが壊れないようにします。
$file = 'ranking.json'; $json = file_get_contents($file); $data = json_decode($json, true); // 新しいデータを追加 $data[] = [ 'name' => '名無しさん', 'score' => 100, 'time' => time() ]; // JSONに戻して保存(排他制御付き) file_put_contents($file, json_encode($data), LOCK_EX);
2. データの取得(ソート)
読み込む時は、PHPの `usort` 関数を使って並び替えます。
点数の高い順(降順)なら `$b - $a`、タイムアタック(昇順)なら `$a - $b` です。
// スコアの降順(大きい順)に並び替え usort($data, function($a, $b) { return $b['score'] - $a['score']; }); // 上位10件だけ取り出す $ranking = array_slice($data, 0, 10);
⚠️ 注意点とデメリット
この方法は手軽ですが、データが数万件を超えるとファイルサイズが大きくなり、動作が重くなります。
その場合は、古いデータを削除する処理を入れるか、大人しくデータベースへの移行を検討しましょう。
当サイトのような「カジュアルゲーム」には最適な構成です。