その10.Redisでビューカウンタを作成
インメモリKVSのRedisをインストールしてWebページのビューカウンタを作ってみます。
PHPでRedisのデータを更新しようと思います。
サーバが落ちてもカウンタ値がリセットされないように永続化の対応も行ってみようと思います。
環境情報
Debian GNU/Linux 9 (stretch)
Apache/2.4.25 (Debian)
PHP 8.0.1
↓のページを参考にしました。
無料枠サーバにRadisをインストールする
■サーバにSSH接続して、次のコマンドを実行します。
$ sudo apt update
インストール情報を更新します。
■次のコマンドでRedisをインストールします。
$ sudo apt install redis-server
途中でディスク容量使う(2MByte)けど続けるかどうかの確認があるので Y で続行します。
■Redisの設定ファイルを修正する
$
sudo vim /etc/redis/redis.conf
supervised no となっている所を、
supervised systemd に変更します。
書き換えたら、ESC → :wq で上書き保存終了します。
■設定変更した内容を反映します。
$
sudo systemctl restart redis
エラーが出なければインストール完了です。
サーバの起動と同時にRedisも起動する設定にしました。
Redisの動作テスト
■Redisの実行状態を確認する
$
sudo systemctl status redis
● redis-server.service - Advanced key-value store
Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2021-02-08 17:26:50 JST; 6min ago
Docs: http://redis.io/documentation,
man:redis-server(1)
Process: 2665 ExecStopPost=/bin/run-parts --verbose /etc/redis/redis-server.post-down.d (code=exited, status=0/SUCCESS)
Process: 2662 ExecStop=/bin/kill -s TERM $MAINPID (code=exited, status=0/SUCCESS)
Process: 2660 ExecStop=/bin/run-parts --verbose /etc/redis/redis-server.pre-down.d (code=exited, status=0/SUCCESS)
Process: 2724 ExecStartPost=/bin/run-parts --verbose /etc/redis/redis-server.post-up.d (code=exited, status=0/SUCCESS)
Process: 2720 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS)
Process: 2718 ExecStartPre=/bin/run-parts --verbose /etc/redis/redis-server.pre-up.d (code=exited, status=0/SUCCESS)
Main PID: 2723 (redis-server)
Tasks: 3 (limit: 4915)
CGroup: /system.slice/redis-server.service
└─2723 /usr/bin/redis-server 127.0.0.1:6379
Feb 08 17:26:50 my-server systemd[1]: Starting Advanced key-value store...
Feb 08 17:26:50 my-server run-parts[2718]: run-parts: executing /etc/redis/redis-server.pre-up.d/00_example
Feb 08 17:26:50 my-server run-parts[2724]: run-parts: executing /etc/redis/redis-server.post-up.d/00_example
Feb 08 17:26:50 my-server systemd[1]: Started Advanced key-value store.
■コマンドラインクライアントを起動して確認コマンドを実行する
$
redis-cli
127.0.0.1:6379> ping
PONG
PONG が返ってくればOKです。
■続いてデータを作成してみる
Redisコマンドラインで下記コマンドを実行します。
127.0.0.1:6379> set test "It's working!"
OK
作成したデータを取得します。
127.0.0.1:6379> get test
"It's working!"
"It’s working!" が取得できれば成功です。
※このデータの有効期限は設定していないのでありません
※有効期限を確認するときは ttl [key] でできます(秒単位)
■コマンドラインを終了する
127.0.0.1:6379> exit
■パスワードを設定する
Redisの設定ファイルを開いてパスワードを設定します。
$
sudo vim /etc/redis/redis.conf
requirepass を修正します。
(/ を押して検索文字を入力)
設定を保存して、Redisを再起動します。
$
sudo systemctl restart redis
コマンドラインを立ち上げて認証をします。
$
redis-cli
127.0.0.1:6379> auth (パスワード)
OK
127.0.0.1:6379> get test
"It's working!"
127.0.0.1:6379> exit
これでほんの少しだけセキュリティが高くなりました。^^
Redisのデータを永続化する
Redisはデフォルトの設定でも一定間隔でディスクにデータが保存されるので、ある程度は永続化されていますが、サーバが突然落ちた場合などは一定時間内のデータが消失してしまうことがあるので、なるべくそのリスクを小さくします。
■設定ファイルで AOF を yes にする
やることはAOF設定をyesにするだけです。
$
sudo vim /etc/redis/redis.conf
設定ファイルを開いて
appendonly no を
appendonly yes にします。
※appendfsync はデフォルトの everysec(毎秒)のままにしておきます
設定を保存して、Redisを再起動します。
$
sudo systemctl restart redis
データの消失リスクが1秒以内になりました。
ひとまずこれで永続化設定は完了です。
注意:
AOFを新規で設定した後に再起動をすると、それまでのデータが空になります。
なので、先ほどの”It’s working!”をもう一度登録しておきましょう。
一度サーバを落として再起動してみましたが、データは保存されていました。
php-redis をインストールする
次のインストールコマンドを実行します。
$
sudo apt-get install php-redis
PHPで接続を確認する
下記内容のPHPファイルをドキュメントルートに配置します。
(/var/www/html/view-count.php にしました)
<?php
$redis = new Redis();
//Connecting to Redis
$redis->connect('127.0.0.1', 6379);
$redis->auth('パスワード');
if ($redis->ping()) {
echo "PONG<br>";
var_dump($redis->get("test"));
}
ブラウザのURLに作成したPHPファイルを指定します。
(外部IP)/view-count.php
Redisのデータを表示できました。^^
Webページの表示回数をカウントして表示する
まずは、redis-cli を使ってカウンターのデータを作ります。
127.0.0.1:6379> set counter 0
OK
127.0.0.1:6379> get counter
"0"
先ほどのPHPで中身を表示してみます。
var_dump($redis->get("counter"));
数をインクリメントする
カウント値を表示するコマンドを get から incr に変更します。
var_dump($redis->incr("counter"));
ページを更新します(何回か)
このままだと味気ないので表示方法を変えます。
カウント値を$count 変数に入れて、
ビューカウント=カウント値
として表示されるようにしました。
これでページの表示回数を表示できるようになりました。
使い方によっては色々出来そうな気がします。^^
0 件のコメント:
コメントを投稿