
商品一覧だとか、人気商品ランキングだとか、リアルタイムによる情報の正確性が重視されない場所で使いやすいのがオブジェクトキャッシュです。使いどころとしては、会員制のサイトなどで、ページ全体のキャッシュが出来ないページでも部分的にキャッシュが出来て便利なのです。
これを実装することで、データベースへの参照回数を減らすことが出来て、知らなかった昨日より優しくなれます。
NoSQLのRedis等もありますが、1つのサーバで事足りるような小~中規模以下なものだと静的なキャッシュの方が、お客様が管理する上でも扱いやすいかと考えています。
環境
- CentOS7
環境を整えよう
WEB+DB+PHPのインストール
# yum install php httpd httpd-devel php-mysql mariadb mariadb-server # systemctl restart httpd # systemctl enable httpd
文字化け防止設定をしようね
# vi /etc/my.cnf [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 # Settings user and group are ignored when systemd is used. # If you need to run mysqld under a different user or group, # customize your systemd unit file for mariadb according to the # instructions in http://fedoraproject.org/wiki/Systemd character-set-server=utf8 ←追加 [mysqld_safe] log-error=/var/log/mariadb/mariadb.log pid-file=/var/run/mariadb/mariadb.pid # # include all files from the config directory # !includedir /etc/my.cnf.d
MariaDBを起動させよう。
# systemctl restart mariadb # systemctl enable mariadb
DBとDBユーザ、テーブルを作ろう。
# mysql -u root
MariaDB [(none)]> CREATE DATABASE sgdb;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON sgdb.* TO dbmaster@localhost IDENTIFIED BY 'dbpass';
MariaDB [(none)]> use sgdb;
MariaDB [(none)]> CREATE TABLE staff(
-> id int auto_increment,
-> name varchar(255),
-> job varchar(255),
-> memo varchar(1024),
-> index(id)
-> );
データのインサート
INSERT INTO sgdb.staff(name, job, memo) VALUES
("Yuu", "Zatuyou", "プラスプラスで頑張ってます。" ),
("Shikaru", "Manager", "設計を見直さなくて大丈夫?後から直すのは大変だよ!" ),
("Kuro", "PG", "でも疲れちゃいましたよね~、休みましょ!休みましょ!" );
レコードの確認をしようね。
MariaDB [sgdb]> SELECT * FROM staff; +----+---------+---------+--------------------------------------------------------------------------------+ | id | name | job | memo | +----+---------+---------+--------------------------------------------------------------------------------+ | 1 | Yuu | Zatuyou | プラスプラスで頑張ってます。 | | 2 | Shikaru | Manager | 設計を見直さなくて大丈夫?後から直すのは大変だよ! | | 3 | Kuro | PG | でも疲れちゃいましたよね~、休みましょ!休みましょ! | +----+---------+---------+--------------------------------------------------------------------------------+ 3 rows in set (0.00 sec)
きちんと、レコードが入っていますね。
用事は済んだからログアウトしよう
MariaDB [sgdb]> exit Bye
バイ!
Composerの導入
# php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
# php composer-setup.php
All settings correct for using Composer
Downloading...
Composer (version 1.6.5) successfully installed to: /var/www/html/composer.phar
Use it: php composer.phar
# php -r "unlink('composer-setup.php');"
# mv composer.phar /usr/local/bin/composer
Cache Liteを導入しよう
# useradd yuu # chown yuu:apache -R /var/www
Composerからインストールしようね
$ cd /var/www/ $ composer require pear/cache_lite ※1分程度待つ Using version ^1.8 for pear/cache_lite ./composer.json has been created Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 1 install, 0 updates, 0 removals - Installing pear/cache_lite (v1.8.2): Downloading (100%) Writing lock file Generating autoload files
状況確認しよう
$ ls -laht /var/www/ 合計 8.0K drwxrwxr-x 4 yuu yuu 54 6月 6 15:14 vendor drwxr-xr-x 5 yuu apache 89 6月 6 15:14 . -rw-rw-r-- 1 yuu yuu 2.2K 6月 6 15:14 composer.lock -rw-rw-r-- 1 yuu yuu 61 6月 6 15:13 composer.json drwxr-xr-x 2 yuu apache 62 6月 6 15:08 html drwxr-xr-x. 20 root root 278 6月 4 17:51 .. drwxr-xr-x 2 yuu apache 6 4月 21 03:11 cgi-bin
Composerのファイルがあるし、大丈夫そうだね。
キャッシュ格納ディレクトリを作ろう
# mkdir -p /var/www/Cache/tmp/ # chmod 777 /var/www/Cache/tmp/
実際にCache Liteを使ってみよう!
Staff.php
$ cat /var/www/html/staff.php
<?php
// Cache_Lite 読み込み
require_once('../vendor/pear/cache_lite/Cache/Lite.php');
// Cache_Lite キャッシュ設定 -----------------------------------
$options = array(
'cacheDir' => '/var/www/Cache/tmp/',
'lifeTime' => 60, //キャッシュ時間
'caching' => true,
'automaticCleaningFactor' => 20,
'automaticSerialization' => true,
'pearErrorMode' => 'CACHE_LITE_ERROR_DIE'
);
// Cache_Lite キャッシュ設定 END ------------------------------
$Cache_Lite = new Cache_Lite($options);
$cache_id = '20171216';
// DB接続関数
function getDb(){
$dsn = 'mysql:dbname=sgdb; host=localhost; charset=utf8;';
$user = 'dbmaster';
$password = 'dbpass';
$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
return $dbh;
}
// キャッシュが存在する場合の処理
if ($cache = $Cache_Lite->get($cache_id))
{
$cache = $Cache_Lite->get($cache_id);
echo "<table border=1>";
foreach($cache as $row )
{
echo "<tr>";
echo "<td>".$row['id']."</td>";
echo "<td>".$row['name']."</td>";
echo "<td>".$row['job']."</td>";
echo "<td>".$row['memo']."</td>";
echo "<tr>";
}
echo "</table>";
echo "キャッシュ有効";
}
// キャッシュが存在しない場合
else {
$db = getDb();
$sql = "SELECT id, name, job, memo FROM staff";
$stt = $db->prepare($sql);
$stt->execute();
echo '<table border=1>';
while( $row = $stt->fetch(PDO::FETCH_ASSOC) )
{
echo "<tr>";
echo "<td>".$row['id']."</td>";
echo "<td>".$row['name']."</td>";
echo "<td>".$row['job']."</td>";
echo "<td>".$row['memo']."</td>";
echo "<tr>";
$cache[] = $row;
}
$stt->closeCursor();
echo "</table>";
$Cache_Lite->save($cache, $cache_id);
echo "キャッシュなんかなくても何やったって生きていけるよ!";
}
アクセスしてみよう!

初回のアクセスはキャッシュされていないから、データベースを参照してデータが表示されます。
もう一度!アクセスだ!

キャッシュされてるね、おめでとう!
キャッシュファイルを見てみよう
# ls -laht /var/www/Cache/tmp/ 合計 4.0K -rw-r--r-- 1 apache apache 354 6月 6 17:25 cache_c21f969b5f03d33d43e04f8f136e7682_ad82e3fedae9a2abfb37bd32cbb2094c drwxrwxrwx 2 root root 85 6月 6 17:15 . drwxr-xr-x 3 root root 17 6月 6 17:14 ..
# cat /var/www/Cache/tmp/cache_c21f969b5f03d33d43e04f8f136e7682_ad82e3fedae9a2abfb37bd32cbb2094c
1890876572a:3:{i:0;a:4:{s:2:"id";s:1:"1";s:4:"name";s:3:"Yuu";s:3:"job";s:7:"Zatuyou";s:4:"memo";s:42:"プ ラスプラスで頑張ってます。";}i:1;a:4:{s:2:"id";s:1:"2";s:4:"name";s:7:"Shikaru";s:3:"job";s:7:"Manager";s:4:"memo";s:75:"設計を 見直さなくて大丈夫?後から直すのは大変だよ!";}i:2;a:4:{s:2:"id";s:1:"3";s:4:"name";s:4:"Kuro";s:3:"job";s:2:"PG";s:4:"memo";s:78:"でも疲れちゃいましたよね~、休みましょ!休みましょ!";}
こんな風に格納されているよ、ページキャッシュが使えない場面でも部分的にキャッシュできるから使いやすいよ。
お疲れ様。
