PHP

PHP Cache_Lite

PHP Cache_Lite オブジェクトキャッシュでデータベースに優しく!

寄稿しました。

 

 

NoSQLのRedis等もありますが、小~中規模なものだと静的なキャッシュの方が、お客様も扱いやすいかと考えています。

 

環境

  • 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 "キャッシュなんかなくても何やったって生きていけるよ!";
}

 

 

 

 

 

Amazonおすすめ

iPad 9世代 2021年最新作

iPad 9世代出たから買い替え。安いぞ!🐱 初めてならiPad。Kindleを外で見るならiPad mini。ほとんどの人には通常のiPadをおすすめします><

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)