phpFastCache
GitHub概要
PHPSocialNetwork/phpfastcache
A high-performance backend cache system. It is intended for use in speeding up dynamic web applications by alleviating database load. Well implemented, it can drops the database load to almost nothing, yielding faster page load times for users, better resource utilization. It is simple yet powerful.
スター2,395
ウォッチ120
フォーク453
作成日:2013年4月27日
言語:PHP
ライセンス:MIT License
トピックス
arangodbcachecassandracouchbasecouchdbdriverdynamodbfirestorememcachedmongodbphpphp7php8phpfastcachepredisredissolrspeedssdbwebsite
スター履歴
データ取得日時: 2025/10/22 08:07
キャッシュライブラリ
phpFastCache
概要
phpFastCacheは、PHP用の高性能バックエンドキャッシュシステムです。動的Webアプリケーションでデータベース負荷を大幅に軽減し、ページ読み込み時間の高速化とリソース使用率の向上を実現します。Files、Redis、Memcache、APCuなど複数のストレージドライバーをサポートし、PSR-6およびPSR-16標準に準拠した統一APIを提供します。
詳細
phpFastCacheは、シンプルながら強力な設計で、適切に実装すればデータベース負荷をほぼゼロに近づけることができます。複数のキャッシュバックエンドを統一インターフェースで管理でき、開発からプロダクションまで一貫した操作性を提供します。
主要な技術的特徴:
- マルチドライバー対応: Files、Redis、Memcache、APCu、SQLite等
- PSR-6/PSR-16準拠: PHP標準キャッシュインターフェース
- イベントシステム: キャッシュ操作のカスタムイベントハンドリング
- タグ機能: 関連キャッシュの一括操作
- TTL/エビクション: 柔軟な有効期限管理
- クラスター対応: RedisArrayによる分散キャッシュ
メリット・デメリット
メリット
- 統一API: 複数のバックエンドを同一インターフェースで操作
- 高性能: 適切な実装でデータベース負荷を大幅削減
- PSR準拠: PHP標準に準拠した互換性
- 豊富な機能: タグ、イベント、TTL、クラスター対応
- 簡単導入: Composerによる簡単インストール
- 柔軟な設定: 環境に応じたドライバー選択
- 実績豊富: 多くのプロダクション環境での実績
デメリット
- PHP専用: 他言語での利用不可
- 学習コスト: 高度な機能には理解が必要
- ドライバー依存: 選択したバックエンドの制約を受ける
- メモリ使用量: PHP実行時のメモリオーバーヘッド
- 設定複雑性: クラスター構成では複雑な設定が必要
- バージョン移行: メジャーバージョン間での破壊的変更
参考ページ
書き方の例
基本的なキャッシュ利用
<?php
use Phpfastcache\CacheManager;
use Phpfastcache\Config\ConfigurationOption;
// 基本設定
CacheManager::setDefaultConfig(new ConfigurationOption([
'path' => '/var/www/cache', // Filesドライバー用のパス
]));
// キャッシュインスタンス取得
$InstanceCache = CacheManager::getInstance('files');
// キャッシュキー
$key = "product_list";
$CachedString = $InstanceCache->getItem($key);
// データ準備
$products = [
'Product 1',
'Product 2',
'Product 3'
];
if (!$CachedString->isHit()) {
// キャッシュにデータが無い場合
$CachedString->set($products)
->expiresAfter(300); // 5分間有効
$InstanceCache->save($CachedString);
echo 'データをキャッシュに保存しました<br>';
} else {
// キャッシュからデータ取得
echo 'キャッシュからデータを取得しました<br>';
}
// データ表示
$cachedData = $CachedString->get();
echo implode('<br>', $cachedData);
?>
PSR-16アダプター利用
<?php
use Phpfastcache\Helper\Psr16Adapter;
// PSR-16準拠のシンプルなAPI
$defaultDriver = 'Files';
$Psr16Adapter = new Psr16Adapter($defaultDriver);
if (!$Psr16Adapter->has('user_settings')) {
// データ設定(5分間有効)
$settings = [
'theme' => 'dark',
'language' => 'ja',
'notifications' => true
];
$Psr16Adapter->set('user_settings', $settings, 300);
} else {
// データ取得
$settings = $Psr16Adapter->get('user_settings');
print_r($settings);
}
?>
複数ドライバーの使い分け
<?php
use Phpfastcache\CacheManager;
use Phpfastcache\Config\ConfigurationOption;
// ファイルキャッシュ設定
$fileCache = CacheManager::getInstance('Files', new ConfigurationOption([
'path' => '/tmp/phpfastcache'
]));
// Redisキャッシュ設定
$redisCache = CacheManager::getInstance('Redis', new ConfigurationOption([
'host' => '127.0.0.1',
'port' => 6379,
'password' => 'your_password'
]));
// APCuキャッシュ(高速アクセス用)
$apcuCache = CacheManager::getInstance('Apcu');
// 用途別の使い分け
// 1. セッションデータ(高速アクセス)
$sessionItem = $apcuCache->getItem('user_session_123');
if (!$sessionItem->isHit()) {
$sessionItem->set(['user_id' => 123, 'role' => 'admin']);
$apcuCache->save($sessionItem);
}
// 2. 複雑なクエリ結果(永続化)
$queryItem = $redisCache->getItem('complex_query_result');
if (!$queryItem->isHit()) {
$queryItem->set(expensive_database_query())
->expiresAfter(3600); // 1時間
$redisCache->save($queryItem);
}
// 3. 画像・ファイル(ファイルシステム)
$imageItem = $fileCache->getItem('processed_image_thumbnail');
if (!$imageItem->isHit()) {
$imageItem->set(generate_thumbnail())
->expiresAfter(86400); // 24時間
$fileCache->save($imageItem);
}
?>
イベントシステムの活用
<?php
use Phpfastcache\EventManager;
use Phpfastcache\CacheManager;
// キャッシュアクセス時のイベントリスナー
EventManager::getInstance()->onCacheGetItem(function($itemPool, $item) {
// デバッグ情報やログ出力
error_log("キャッシュアクセス: " . $item->getKey());
// データの変更(例:プレフィックス追加)
if ($item->isHit()) {
$item->set('[CACHED] ' . $item->get());
}
}, 'debug_listener');
// キャッシュ保存時のイベント
EventManager::getInstance()->onCacheSaveItem(function($itemPool, $item) {
error_log("キャッシュ保存: " . $item->getKey() . " = " . strlen($item->get()) . " bytes");
}, 'save_logger');
$cache = CacheManager::getInstance('Files');
// 通常のキャッシュ操作(イベントが自動発火)
$item = $cache->getItem('test_key');
if (!$item->isHit()) {
$item->set('テストデータ');
$cache->save($item);
}
// イベントリスナーの削除
EventManager::getInstance()->unbindEventCallback('onCacheGetItem', 'debug_listener');
?>
タグによるキャッシュ管理
<?php
use Phpfastcache\CacheManager;
$cache = CacheManager::getInstance('Redis');
// タグ付きキャッシュアイテムの作成
$userItem = $cache->getItem('user_profile_123');
$userItem->set(['name' => '田中太郎', 'email' => '[email protected]'])
->expiresAfter(3600)
->addTag('user')
->addTag('profile');
$cache->save($userItem);
// 別のユーザープロファイル
$userItem2 = $cache->getItem('user_profile_456');
$userItem2->set(['name' => '山田花子', 'email' => '[email protected]'])
->expiresAfter(3600)
->addTag('user')
->addTag('profile');
$cache->save($userItem2);
// 商品データ
$productItem = $cache->getItem('product_789');
$productItem->set(['name' => 'ノートPC', 'price' => 89800])
->expiresAfter(7200)
->addTag('product')
->addTag('electronics');
$cache->save($productItem);
// タグによる一括削除
// 全てのユーザー関連キャッシュを削除
$cache->deleteItemsByTag('user');
// 特定の複数タグに一致するキャッシュを削除
$cache->deleteItemsByTagsAll(['product', 'electronics']);
// タグによるキャッシュアイテム取得
$userItems = $cache->getItemsByTag('profile');
foreach ($userItems as $item) {
echo "キャッシュキー: " . $item->getKey() . "\n";
}
?>
複雑な設定とクラスター構成
<?php
use Phpfastcache\CacheManager;
use Phpfastcache\Drivers\Redis\Config as RedisConfig;
// Redis クラスター構成
$config = new RedisConfig([
'host' => '127.0.0.1',
'port' => 6379,
'password' => 'secure_password',
'database' => 1,
'timeout' => 5,
'read_timeout' => 3,
// 圧縮設定
'compression' => true,
// 永続化接続
'persistent' => true,
// セキュリティ設定
'secure_file_manipulation' => true
]);
$cache = CacheManager::getInstance('Redis', $config, 'cluster_primary');
// 高度なキャッシュ操作
$complexItem = $cache->getItem('analytics_data');
if (!$complexItem->isHit()) {
// 重い処理をシミュレート
$analytics = [
'page_views' => 15234,
'unique_visitors' => 8456,
'bounce_rate' => 0.34,
'generated_at' => date('Y-m-d H:i:s')
];
$complexItem->set($analytics)
->expiresAfter(1800) // 30分
->addTag('analytics')
->addTag('dashboard');
$cache->save($complexItem);
echo "アナリティクスデータをキャッシュに保存\n";
} else {
$analytics = $complexItem->get();
echo "キャッシュからアナリティクスデータを取得\n";
echo "生成時刻: " . $analytics['generated_at'] . "\n";
}
// キャッシュ統計情報
$stats = $cache->getStats();
echo "キャッシュ統計:\n";
echo "- ヒット数: " . $stats->getHits() . "\n";
echo "- ミス数: " . $stats->getMisses() . "\n";
echo "- データサイズ: " . $stats->getSize() . " bytes\n";
?>
設定ファイルベースの管理
<?php
// config/cache.php
return [
'default_driver' => 'redis',
'drivers' => [
'files' => [
'driver' => 'Files',
'path' => '/var/cache/phpfastcache',
'secure_file_manipulation' => true
],
'redis' => [
'driver' => 'Redis',
'host' => $_ENV['REDIS_HOST'] ?? '127.0.0.1',
'port' => $_ENV['REDIS_PORT'] ?? 6379,
'password' => $_ENV['REDIS_PASSWORD'] ?? null,
'database' => $_ENV['REDIS_DB'] ?? 0
],
'memcached' => [
'driver' => 'Memcached',
'servers' => [
['127.0.0.1', 11211, 100]
]
]
]
];
// キャッシュマネージャー
class CacheService {
private static $instances = [];
private static $config;
public static function init($configPath) {
self::$config = require $configPath;
}
public static function getInstance($driver = null) {
$driver = $driver ?: self::$config['default_driver'];
if (!isset(self::$instances[$driver])) {
$config = self::$config['drivers'][$driver];
$driverName = $config['driver'];
unset($config['driver']);
self::$instances[$driver] = CacheManager::getInstance(
$driverName,
new ConfigurationOption($config)
);
}
return self::$instances[$driver];
}
}
// 使用例
CacheService::init(__DIR__ . '/config/cache.php');
$cache = CacheService::getInstance(); // デフォルトドライバー
$fileCache = CacheService::getInstance('files'); // ファイルドライバー
?>