キャッシュハンドラ関数 (拡張機能) - PHPプロ!マニュアル

Smartyマニュアル

拡張機能 - キャッシュハンドラ関数

キャッシュハンドラ関数

デフォルトのファイルベースのキャッシュメカニズムの代替として、 キャッシュファイルの読み書きや破棄を直接行うキャッシュハンドラ関数を指定できます。

まず、アプリケーション内にSmartyがキャッシュハンドラとして使用するための関数を定義します。 そしてその関数名を $cache_handler_func クラス変数に指定します。Smarty は、これを使用してキャッシュされたデータを処理します。

  • 第1パラメータはキャッシュの動作を表す文字列で、これは readwrite および clear のいずれかとなります。

  • 第2パラメータは Smarty オブジェクトです。

  • 第3パラメータはキャッシュの内容です。 write の場合はキャッシュされたコンテンツが渡され、 read の場合は参照を受け取ってそこにキャッシュされたコンテンツを書き込み、 clear の場合はこのパラメータの値を使用しないのでダミーの変数が渡されます。

  • 第4パラメータはテンプレートファイル名です('read'又は'write'の場合に必要)。

  • 任意の第5パラメータは $cache_id です。

  • 任意の第6パラメータは $compile_id です。

  • 最後の第7パラメータ $exp_time は Smarty-2.6.0 で追加されました。

例 15-5. キャッシュソースとしてMySQLを使用する例

<?php
/**************************************************
example usage:

include('Smarty.class.php');
include('mysql_cache_handler.php');

$smarty = new Smarty;
$smarty->cache_handler_func = 'mysql_cache_handler';

$smarty->display('index.tpl');


MySQLデータベースのスキーマ定義

create database SMARTY_CACHE;

create table CACHE_PAGES(
CacheID char(32) PRIMARY KEY,
CacheContents MEDIUMTEXT NOT NULL
);

**************************************************/

function mysql_cache_handler($action, &$smarty_obj, &$cache_content$tpl_file=null$cache_id=null$compile_id=null$exp_time=null)
{
    
// ここでDBのホスト名・ユーザ名・パスワードを指定します
    
$db_host 'localhost';
    
$db_user 'myuser';
    
$db_pass 'mypass';
    
$db_name 'SMARTY_CACHE';
    
$use_gzip false;

    
// ユニークなキャッシュIDを作成します
    
$CacheID md5($tpl_file.$cache_id.$compile_id);

    if(! 
$link mysql_pconnect($db_host$db_user$db_pass)) {
        
$smarty_obj->_trigger_error_msg('cache_handler: could not connect to database');
        return 
false;
    }
    
mysql_select_db($db_name);

    switch (
$action) {
        case 
'read':
            
// キャッシュをデータベースから読み込みます
            
$results mysql_query("select CacheContents from CACHE_PAGES where CacheID='$CacheID'");
            if(!
$results) {
                
$smarty_obj->_trigger_error_msg('cache_handler: query failed.');
            }
            
$row mysql_fetch_array($results,MYSQL_ASSOC);

            if(
$use_gzip && function_exists('gzuncompress')) {
                
$cache_content gzuncompress($row['CacheContents']);
            } else {
                
$cache_content $row['CacheContents'];
            }
            
$return $results;
            break;
        case 
'write':
            
// キャッシュをデータベースに保存します

            
if($use_gzip && function_exists("gzcompress")) {
                
// 記憶効率のために内容を圧縮します
                
$contents gzcompress($cache_content);
            } else {
                
$contents $cache_content;
            }
            
$results mysql_query("replace into CACHE_PAGES values(
                            '$CacheID',
                            '"
.addslashes($contents)."')
                        "
);
            if(!
$results) {
                
$smarty_obj->_trigger_error_msg('cache_handler: query failed.');
            }
            
$return $results;
            break;
        case 
'clear':
            
// キャッシュ情報を破棄します
            
if(empty($cache_id) && empty($compile_id) && empty($tpl_file)) {
                
// 全てのキャッシュを破棄します
                
$results mysql_query('delete from CACHE_PAGES');
            } else {
                
$results mysql_query("delete from CACHE_PAGES where CacheID='$CacheID'");
            }
            if(!
$results) {
                
$smarty_obj->_trigger_error_msg('cache_handler: query failed.');
            }
            
$return $results;
            break;
        default:
            
// エラー・未知の動作
            
$smarty_obj->_trigger_error_msg("cache_handler: unknown action \"$action\"");
            
$return false;
            break;
    }
    
mysql_close($link);
    return 
$return;

}

?>


Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)

Q&A掲示板 新着情報