[PHP]session_cache_expire関数を完全解説!セッションページのキャッシュ有効期限を設定する方法

PHP

こんにちは!今回は、PHPの標準関数であるsession_cache_expire()について詳しく解説していきます。セッションページのキャッシュ有効期限を制御できる、セッション管理の重要な関数です!

session_cache_expire関数とは?

session_cache_expire()関数は、現在のセッションページのキャッシュ有効期限を取得または設定する関数です。

ブラウザやプロキシサーバーがセッションページをキャッシュする期間を分単位で指定します。セキュリティやパフォーマンスの最適化に重要な役割を果たします!

基本的な構文

session_cache_expire(?int $value = null): int|false
  • $value: キャッシュ有効期限(分単位)、省略時は現在の値を取得
  • 戻り値: 現在の設定値(分単位)、失敗時はfalse

重要な注意点

// session_start()の前に呼び出す必要がある
session_cache_expire(30);  // これが正しい順序
session_start();

// session_start()の後では効果なし
session_start();
session_cache_expire(30);  // 効果なし(警告が出る場合あり)

// デフォルト値は180分(3時間)
echo session_cache_expire();  // 180

基本的な使用例

現在の値を取得

// デフォルト値を確認
$expire = session_cache_expire();
echo "現在のキャッシュ有効期限: {$expire}分\n";
// 出力: 現在のキャッシュ有効期限: 180分

有効期限を設定

// 30分に設定
$old_expire = session_cache_expire(30);
echo "以前の値: {$old_expire}分\n";
echo "新しい値: " . session_cache_expire() . "分\n";

session_start();

キャッシュを無効化

// キャッシュを無効化(0に設定)
session_cache_expire(0);
session_start();

// これにより、ブラウザはページをキャッシュしない

長期キャッシュの設定

// 24時間(1440分)に設定
session_cache_expire(1440);
session_start();

// 公開ページで認証情報が不要な場合に使用

php.iniの設定を確認

// php.iniの設定値を確認
$ini_value = ini_get('session.cache_expire');
echo "php.ini設定: {$ini_value}分\n";

// 実行時に変更
session_cache_expire(60);
echo "変更後: " . session_cache_expire() . "分\n";

session_start();

実践的な使用例

例1: ページタイプ別キャッシュ管理

class PageCacheManager {
    /**
     * ページタイプに応じたキャッシュ設定
     */
    public static function configurePage($pageType) {
        switch ($pageType) {
            case 'public':
                // 公開ページ - 長時間キャッシュ
                session_cache_expire(1440);  // 24時間
                session_cache_limiter('public');
                break;
                
            case 'private':
                // プライベートページ - 短時間キャッシュ
                session_cache_expire(30);  // 30分
                session_cache_limiter('private');
                break;
                
            case 'sensitive':
                // 機密ページ - キャッシュ無効
                session_cache_expire(0);
                session_cache_limiter('nocache');
                break;
                
            case 'api':
                // API - キャッシュなし
                session_cache_expire(0);
                session_cache_limiter('');
                break;
                
            default:
                // デフォルト - 標準設定
                session_cache_expire(180);  // 3時間
                session_cache_limiter('nocache');
        }
        
        return [
            'expire' => session_cache_expire(),
            'limiter' => session_cache_limiter()
        ];
    }
    
    /**
     * セキュアページの設定
     */
    public static function configureSecure() {
        // キャッシュを完全に無効化
        session_cache_expire(0);
        session_cache_limiter('nocache');
        
        return self::getSettings();
    }
    
    /**
     * 現在の設定を取得
     */
    public static function getSettings() {
        return [
            'cache_expire' => session_cache_expire(),
            'cache_limiter' => session_cache_limiter(),
            'cookie_lifetime' => session_get_cookie_params()['lifetime']
        ];
    }
    
    /**
     * カスタム設定
     */
    public static function configureCustom($expireMinutes, $limiter = 'nocache') {
        session_cache_expire($expireMinutes);
        session_cache_limiter($limiter);
        
        return self::getSettings();
    }
}

// 使用例
echo "=== ページタイプ別キャッシュ設定 ===\n";

// 公開ページ
echo "\n公開ページ:\n";
$config = PageCacheManager::configurePage('public');
echo "  有効期限: {$config['expire']}分\n";
echo "  リミッター: {$config['limiter']}\n";

// プライベートページ
echo "\nプライベートページ:\n";
$config = PageCacheManager::configurePage('private');
echo "  有効期限: {$config['expire']}分\n";
echo "  リミッター: {$config['limiter']}\n";

// 機密ページ
echo "\n機密ページ:\n";
$config = PageCacheManager::configurePage('sensitive');
echo "  有効期限: {$config['expire']}分\n";
echo "  リミッター: {$config['limiter']}\n";

// セッション開始
session_start();
echo "\nセッション開始完了\n";

例2: 認証システムとの統合

class AuthenticationCacheController {
    private $isAuthenticated = false;
    private $userRole = 'guest';
    
    /**
     * ログイン処理
     */
    public function login($username, $password) {
        // 認証前の設定(キャッシュ無効)
        session_cache_expire(0);
        session_cache_limiter('nocache');
        session_start();
        
        // 認証処理(簡略化)
        if ($this->authenticate($username, $password)) {
            $this->isAuthenticated = true;
            $this->userRole = $this->getUserRole($username);
            
            // セッションに保存
            $_SESSION['authenticated'] = true;
            $_SESSION['username'] = $username;
            $_SESSION['role'] = $this->userRole;
            $_SESSION['login_time'] = time();
            
            // 認証後のキャッシュ設定を調整
            $this->adjustCacheSettings();
            
            return [
                'success' => true,
                'message' => 'Login successful',
                'cache_settings' => $this->getCacheSettings()
            ];
        }
        
        return [
            'success' => false,
            'message' => 'Invalid credentials'
        ];
    }
    
    /**
     * 認証後のキャッシュ設定を調整
     */
    private function adjustCacheSettings() {
        // ロールに応じてキャッシュ設定を変更
        switch ($this->userRole) {
            case 'admin':
                // 管理者 - キャッシュなし
                $_SESSION['cache_expire'] = 0;
                break;
                
            case 'user':
                // 一般ユーザー - 短時間キャッシュ
                $_SESSION['cache_expire'] = 30;
                break;
                
            case 'guest':
            default:
                // ゲスト - キャッシュなし
                $_SESSION['cache_expire'] = 0;
        }
    }
    
    /**
     * ページアクセス時の設定
     */
    public function configurePageAccess() {
        if (!isset($_SESSION['authenticated'])) {
            // 未認証 - キャッシュ無効
            session_cache_expire(0);
            session_cache_limiter('nocache');
        } else {
            // 認証済み - ロールに応じた設定
            $expire = $_SESSION['cache_expire'] ?? 0;
            session_cache_expire($expire);
            session_cache_limiter('private');
        }
    }
    
    /**
     * ログアウト処理
     */
    public function logout() {
        session_start();
        
        // キャッシュ設定をリセット
        session_cache_expire(0);
        session_cache_limiter('nocache');
        
        // セッション破棄
        $_SESSION = [];
        session_destroy();
        
        return [
            'success' => true,
            'message' => 'Logged out successfully'
        ];
    }
    
    /**
     * 現在のキャッシュ設定を取得
     */
    private function getCacheSettings() {
        return [
            'expire' => session_cache_expire(),
            'limiter' => session_cache_limiter()
        ];
    }
    
    /**
     * 認証処理(ダミー)
     */
    private function authenticate($username, $password) {
        return $username === 'test' && $password === 'password';
    }
    
    /**
     * ユーザーロール取得(ダミー)
     */
    private function getUserRole($username) {
        return $username === 'admin' ? 'admin' : 'user';
    }
}

// 使用例
echo "=== 認証システム ===\n";

$auth = new AuthenticationCacheController();

// ログイン試行
echo "ログイン処理:\n";
$result = $auth->login('test', 'password');
echo "  結果: " . ($result['success'] ? '成功' : '失敗') . "\n";
if ($result['success']) {
    echo "  メッセージ: {$result['message']}\n";
    echo "  キャッシュ有効期限: {$result['cache_settings']['expire']}分\n";
    echo "  キャッシュリミッター: {$result['cache_settings']['limiter']}\n";
}

例3: APIレスポンスキャッシュ制御

class ApiCacheController {
    private $endpoint;
    private $cacheStrategy;
    
    /**
     * APIコントローラーを初期化
     */
    public function __construct($endpoint, $cacheStrategy = 'no-cache') {
        $this->endpoint = $endpoint;
        $this->cacheStrategy = $cacheStrategy;
    }
    
    /**
     * エンドポイントに応じたキャッシュ設定
     */
    public function configure() {
        switch ($this->cacheStrategy) {
            case 'cacheable':
                // キャッシュ可能なエンドポイント
                session_cache_expire(60);  // 60分
                session_cache_limiter('public');
                break;
                
            case 'private-cache':
                // プライベートキャッシュ
                session_cache_expire(15);  // 15分
                session_cache_limiter('private');
                break;
                
            case 'no-cache':
            default:
                // キャッシュなし(デフォルト)
                session_cache_expire(0);
                session_cache_limiter('nocache');
        }
        
        return $this->getConfig();
    }
    
    /**
     * レスポンスヘッダーを設定
     */
    public function setResponseHeaders() {
        $this->configure();
        session_start();
        
        // 追加のキャッシュヘッダー
        $expire = session_cache_expire();
        
        if ($expire > 0) {
            $maxAge = $expire * 60;  // 秒に変換
            header("Cache-Control: max-age={$maxAge}");
            header("Expires: " . gmdate('D, d M Y H:i:s', time() + $maxAge) . ' GMT');
        } else {
            header("Cache-Control: no-store, no-cache, must-revalidate");
            header("Pragma: no-cache");
            header("Expires: 0");
        }
        
        return $this->getConfig();
    }
    
    /**
     * 現在の設定を取得
     */
    public function getConfig() {
        return [
            'endpoint' => $this->endpoint,
            'strategy' => $this->cacheStrategy,
            'expire_minutes' => session_cache_expire(),
            'expire_seconds' => session_cache_expire() * 60,
            'limiter' => session_cache_limiter()
        ];
    }
    
    /**
     * 条件付きキャッシュ
     */
    public function configureConditional($condition) {
        if ($condition['is_public'] && !$condition['has_user_data']) {
            $this->cacheStrategy = 'cacheable';
        } elseif ($condition['has_user_data']) {
            $this->cacheStrategy = 'private-cache';
        } else {
            $this->cacheStrategy = 'no-cache';
        }
        
        return $this->configure();
    }
}

// 使用例
echo "=== APIキャッシュ制御 ===\n";

// キャッシュ可能なエンドポイント
echo "公開API(キャッシュ可):\n";
$api1 = new ApiCacheController('/api/public/data', 'cacheable');
$config1 = $api1->configure();
echo "  有効期限: {$config1['expire_minutes']}分\n";
echo "  戦略: {$config1['strategy']}\n";

// プライベートキャッシュ
echo "\nユーザーAPI(プライベートキャッシュ):\n";
$api2 = new ApiCacheController('/api/user/profile', 'private-cache');
$config2 = $api2->configure();
echo "  有効期限: {$config2['expire_minutes']}分\n";
echo "  戦略: {$config2['strategy']}\n";

// キャッシュなし
echo "\n機密API(キャッシュなし):\n";
$api3 = new ApiCacheController('/api/admin/settings', 'no-cache');
$config3 = $api3->configure();
echo "  有効期限: {$config3['expire_minutes']}分\n";
echo "  戦略: {$config3['strategy']}\n";

// 条件付きキャッシュ
echo "\n条件付きキャッシュ:\n";
$api4 = new ApiCacheController('/api/content', 'auto');
$config4 = $api4->configureConditional([
    'is_public' => true,
    'has_user_data' => false
]);
echo "  有効期限: {$config4['expire_minutes']}分\n";
echo "  自動選択された戦略: {$config4['strategy']}\n";

例4: セッション設定マネージャー

class SessionConfigManager {
    private $profiles = [];
    
    /**
     * 設定プロファイルを登録
     */
    public function __construct() {
        $this->profiles = [
            'high_security' => [
                'cache_expire' => 0,
                'cache_limiter' => 'nocache',
                'cookie_lifetime' => 0,
                'description' => '高セキュリティ - キャッシュなし'
            ],
            'standard' => [
                'cache_expire' => 30,
                'cache_limiter' => 'private',
                'cookie_lifetime' => 3600,
                'description' => '標準 - 30分キャッシュ'
            ],
            'long_session' => [
                'cache_expire' => 180,
                'cache_limiter' => 'private',
                'cookie_lifetime' => 86400,
                'description' => '長時間セッション - 3時間キャッシュ'
            ],
            'public_content' => [
                'cache_expire' => 1440,
                'cache_limiter' => 'public',
                'cookie_lifetime' => 0,
                'description' => '公開コンテンツ - 24時間キャッシュ'
            ]
        ];
    }
    
    /**
     * プロファイルを適用
     */
    public function applyProfile($profileName) {
        if (!isset($this->profiles[$profileName])) {
            throw new Exception("Unknown profile: {$profileName}");
        }
        
        $profile = $this->profiles[$profileName];
        
        // セッション設定を適用
        session_cache_expire($profile['cache_expire']);
        session_cache_limiter($profile['cache_limiter']);
        
        // クッキーライフタイム設定
        ini_set('session.cookie_lifetime', $profile['cookie_lifetime']);
        
        return [
            'profile' => $profileName,
            'description' => $profile['description'],
            'settings' => $this->getCurrentSettings()
        ];
    }
    
    /**
     * カスタムプロファイルを作成
     */
    public function createProfile($name, $cacheExpire, $cacheLimiter, $cookieLifetime, $description = '') {
        $this->profiles[$name] = [
            'cache_expire' => $cacheExpire,
            'cache_limiter' => $cacheLimiter,
            'cookie_lifetime' => $cookieLifetime,
            'description' => $description
        ];
        
        return true;
    }
    
    /**
     * 利用可能なプロファイル一覧
     */
    public function listProfiles() {
        $list = [];
        
        foreach ($this->profiles as $name => $profile) {
            $list[] = [
                'name' => $name,
                'description' => $profile['description'],
                'cache_expire' => $profile['cache_expire'],
                'cache_limiter' => $profile['cache_limiter']
            ];
        }
        
        return $list;
    }
    
    /**
     * 現在の設定を取得
     */
    public function getCurrentSettings() {
        return [
            'cache_expire' => session_cache_expire(),
            'cache_limiter' => session_cache_limiter(),
            'cookie_lifetime' => ini_get('session.cookie_lifetime')
        ];
    }
    
    /**
     * 設定を比較
     */
    public function compareProfiles($profile1, $profile2) {
        if (!isset($this->profiles[$profile1]) || !isset($this->profiles[$profile2])) {
            throw new Exception("One or both profiles not found");
        }
        
        return [
            $profile1 => $this->profiles[$profile1],
            $profile2 => $this->profiles[$profile2],
            'differences' => $this->findDifferences(
                $this->profiles[$profile1],
                $this->profiles[$profile2]
            )
        ];
    }
    
    /**
     * 差分を検出
     */
    private function findDifferences($profile1, $profile2) {
        $diff = [];
        
        foreach ($profile1 as $key => $value) {
            if ($value !== $profile2[$key]) {
                $diff[$key] = [
                    'profile1' => $value,
                    'profile2' => $profile2[$key]
                ];
            }
        }
        
        return $diff;
    }
}

// 使用例
echo "=== セッション設定マネージャー ===\n";

$manager = new SessionConfigManager();

// 利用可能なプロファイル
echo "利用可能なプロファイル:\n";
foreach ($manager->listProfiles() as $profile) {
    echo "  {$profile['name']}: {$profile['description']}\n";
    echo "    有効期限: {$profile['cache_expire']}分\n";
}

// 高セキュリティプロファイルを適用
echo "\n高セキュリティプロファイルを適用:\n";
$result = $manager->applyProfile('high_security');
echo "  プロファイル: {$result['profile']}\n";
echo "  説明: {$result['description']}\n";
echo "  キャッシュ有効期限: {$result['settings']['cache_expire']}分\n";
echo "  キャッシュリミッター: {$result['settings']['cache_limiter']}\n";

// カスタムプロファイルを作成
echo "\nカスタムプロファイル作成:\n";
$manager->createProfile('custom_api', 45, 'private', 7200, 'カスタムAPI用設定');
$result = $manager->applyProfile('custom_api');
echo "  適用完了: {$result['description']}\n";

// プロファイル比較
echo "\nプロファイル比較:\n";
$comparison = $manager->compareProfiles('high_security', 'standard');
echo "  high_security vs standard:\n";
foreach ($comparison['differences'] as $key => $diff) {
    echo "    {$key}: {$diff['profile1']} vs {$diff['profile2']}\n";
}

例5: 動的キャッシュ調整

class DynamicCacheAdjuster {
    /**
     * トラフィックに基づいてキャッシュを調整
     */
    public function adjustByTraffic($currentLoad) {
        if ($currentLoad < 30) {
            // 低負荷 - キャッシュ最小
            session_cache_expire(15);
            $strategy = 'low_cache';
        } elseif ($currentLoad < 70) {
            // 中負荷 - 標準キャッシュ
            session_cache_expire(60);
            $strategy = 'medium_cache';
        } else {
            // 高負荷 - キャッシュ最大
            session_cache_expire(180);
            $strategy = 'high_cache';
        }
        
        return [
            'load' => $currentLoad,
            'strategy' => $strategy,
            'cache_expire' => session_cache_expire()
        ];
    }
    
    /**
     * 時間帯に基づいてキャッシュを調整
     */
    public function adjustByTimeOfDay() {
        $hour = (int)date('H');
        
        if ($hour >= 9 && $hour < 17) {
            // ビジネスアワー - 短いキャッシュ
            session_cache_expire(30);
            $period = 'business_hours';
        } elseif ($hour >= 22 || $hour < 6) {
            // 深夜 - 長いキャッシュ
            session_cache_expire(180);
            $period = 'night';
        } else {
            // その他 - 中程度
            session_cache_expire(60);
            $period = 'off_peak';
        }
        
        return [
            'hour' => $hour,
            'period' => $period,
            'cache_expire' => session_cache_expire()
        ];
    }
    
    /**
     * ユーザー行動に基づいて調整
     */
    public function adjustByUserBehavior($userActivity) {
        if ($userActivity['is_active'] && $userActivity['recent_updates'] > 0) {
            // アクティブユーザー - キャッシュ短め
            session_cache_expire(10);
            $behavior = 'active';
        } elseif ($userActivity['idle_time'] > 1800) {
            // アイドル状態 - キャッシュ長め
            session_cache_expire(120);
            $behavior = 'idle';
        } else {
            // 通常 - 標準キャッシュ
            session_cache_expire(30);
            $behavior = 'normal';
        }
        
        return [
            'behavior' => $behavior,
            'cache_expire' => session_cache_expire(),
            'idle_time' => $userActivity['idle_time']
        ];
    }
    
    /**
     * コンテンツタイプに基づいて調整
     */
    public function adjustByContentType($contentType) {
        $cacheSettings = [
            'static' => 1440,      // 24時間
            'semi-static' => 180,  // 3時間
            'dynamic' => 30,       // 30分
            'real-time' => 0       // キャッシュなし
        ];
        
        $expire = $cacheSettings[$contentType] ?? 60;
        session_cache_expire($expire);
        
        return [
            'content_type' => $contentType,
            'cache_expire' => session_cache_expire()
        ];
    }
    
    /**
     * 複合条件で調整
     */
    public function adjustByMultipleFactors($factors) {
        $score = 0;
        
        // 負荷スコア
        if ($factors['load'] > 70) $score += 3;
        elseif ($factors['load'] > 30) $score += 2;
        else $score += 1;
        
        // ユーザータイプスコア
        if ($factors['user_type'] === 'premium') $score += 1;
        
        // コンテンツタイプスコア
        if ($factors['content_type'] === 'static') $score += 2;
        
        // スコアに基づいてキャッシュを設定
        $expireMap = [
            1 => 10,   // 最小
            2 => 30,
            3 => 60,
            4 => 120,
            5 => 180,
            6 => 360   // 最大
        ];
        
        $expire = $expireMap[min($score, 6)] ?? 60;
        session_cache_expire($expire);
        
        return [
            'score' => $score,
            'factors' => $factors,
            'cache_expire' => session_cache_expire()
        ];
    }
}

// 使用例
echo "=== 動的キャッシュ調整 ===\n";

$adjuster = new DynamicCacheAdjuster();

// トラフィック負荷に基づく調整
echo "トラフィック負荷による調整:\n";
$loads = [25, 50, 85];
foreach ($loads as $load) {
    $result = $adjuster->adjustByTraffic($load);
    echo "  負荷{$result['load']}%: {$result['strategy']} - {$result['cache_expire']}分\n";
}

// 時間帯による調整
echo "\n時間帯による調整:\n";
$result = $adjuster->adjustByTimeOfDay();
echo "  現在{$result['hour']}時: {$result['period']} - {$result['cache_expire']}分\n";

// ユーザー行動による調整
echo "\nユーザー行動による調整:\n";
$activities = [
    ['is_active' => true, 'recent_updates' => 5, 'idle_time' => 0],
    ['is_active' => false, 'recent_updates' => 0, 'idle_time' => 2000]
];
foreach ($activities as $activity) {
    $result = $adjuster->adjustByUserBehavior($activity);
    echo "  {$result['behavior']}: {$result['cache_expire']}分\n";
}

// 複合条件による調整
echo "\n複合条件による調整:\n";
$result = $adjuster->adjustByMultipleFactors([
    'load' => 80,
    'user_type' => 'premium',
    'content_type' => 'static'
]);
echo "  スコア: {$result['score']}\n";
echo "  キャッシュ有効期限: {$result['cache_expire']}分\n";

例6: キャッシュパフォーマンスモニター

class CachePerformanceMonitor {
    private $metrics = [];
    
    /**
     * パフォーマンス測定を開始
     */
    public function startMeasurement($expireMinutes) {
        session_cache_expire($expireMinutes);
        
        $this->metrics['start_time'] = microtime(true);
        $this->metrics['expire_setting'] = $expireMinutes;
        $this->metrics['limiter'] = session_cache_limiter();
        
        session_start();
        
        return $this;
    }
    
    /**
     * 測定を終了
     */
    public function endMeasurement() {
        $this->metrics['end_time'] = microtime(true);
        $this->metrics['duration'] = $this->metrics['end_time'] - $this->metrics['start_time'];
        
        return $this->getReport();
    }
    
    /**
     * レポートを生成
     */
    public function getReport() {
        return [
            'cache_expire' => $this->metrics['expire_setting'],
            'cache_limiter' => $this->metrics['limiter'],
            'duration_ms' => round($this->metrics['duration'] * 1000, 3),
            'session_id' => session_id(),
            'timestamp' => date('Y-m-d H:i:s')
        ];
    }
    
    /**
     * 複数設定を比較
     */
    public function compareSettings($settings) {
        $results = [];
        
        foreach ($settings as $name => $expire) {
            session_write_close();  // 既存セッションを閉じる
            
            $this->startMeasurement($expire);
            
            // 処理をシミュレート
            for ($i = 0; $i < 1000; $i++) {
                $_SESSION['test_' . $i] = str_repeat('x', 100);
            }
            
            $results[$name] = $this->endMeasurement();
        }
        
        return $results;
    }
    
    /**
     * 最適な設定を推奨
     */
    public function recommendOptimal($comparisonResults) {
        $optimal = null;
        $minDuration = PHP_FLOAT_MAX;
        
        foreach ($comparisonResults as $name => $result) {
            if ($result['duration_ms'] < $minDuration) {
                $minDuration = $result['duration_ms'];
                $optimal = [
                    'name' => $name,
                    'expire' => $result['cache_expire'],
                    'duration_ms' => $result['duration_ms']
                ];
            }
        }
        
        return $optimal;
    }
}

// 使用例
echo "=== キャッシュパフォーマンスモニター ===\n";

$monitor = new CachePerformanceMonitor();

// 設定を比較
echo "異なるキャッシュ設定の比較:\n";
$settings = [
    'no_cache' => 0,
    'short' => 15,
    'medium' => 60,
    'long' => 180
];

$results = $monitor->compareSettings($settings);

foreach ($results as $name => $result) {
    echo "\n{$name}:\n";
    echo "  有効期限: {$result['cache_expire']}分\n";
    echo "  処理時間: {$result['duration_ms']}ms\n";
}

// 最適設定を推奨
$optimal = $monitor->recommendOptimal($results);
echo "\n推奨設定:\n";
echo "  名前: {$optimal['name']}\n";
echo "  有効期限: {$optimal['expire']}分\n";
echo "  処理時間: {$optimal['duration_ms']}ms\n";

HTTPヘッダーとの関係

// session_cache_limiterと組み合わせて使用

// nocache(デフォルト)
session_cache_expire(30);
session_cache_limiter('nocache');
session_start();
// 送信されるヘッダー:
// Expires: Thu, 19 Nov 1981 08:52:00 GMT
// Cache-Control: no-store, no-cache, must-revalidate
// Pragma: no-cache

// private
session_cache_expire(30);
session_cache_limiter('private');
session_start();
// 送信されるヘッダー:
// Expires: (現在時刻 + 30分)
// Cache-Control: private, max-age=1800

// public
session_cache_expire(60);
session_cache_limiter('public');
session_start();
// 送信されるヘッダー:
// Expires: (現在時刻 + 60分)
// Cache-Control: public, max-age=3600

まとめ

session_cache_expire()関数の特徴をまとめると:

できること:

  • セッションページのキャッシュ有効期限を設定
  • キャッシュ期間の取得
  • ブラウザキャッシュの制御

単位:

  • 分単位で指定
  • デフォルト: 180分(3時間)
  • 0で無効化

推奨される使用場面:

  • 認証ページ(キャッシュ無効)
  • 公開コンテンツ(長時間キャッシュ)
  • APIエンドポイント
  • パフォーマンス最適化
  • セキュリティ強化

重要な注意点:

  • session_start()の前に呼び出す
  • session_cache_limiter()と組み合わせて使用
  • HTTPヘッダーに影響
  • ブラウザとプロキシのキャッシュを制御

session_cache_limiter()との組み合わせ:

// セキュアページ
session_cache_expire(0);
session_cache_limiter('nocache');

// プライベートページ
session_cache_expire(30);
session_cache_limiter('private');

// 公開ページ
session_cache_expire(1440);
session_cache_limiter('public');

ベストプラクティス:

// 1. ページタイプに応じた設定
if ($isSecure) {
    session_cache_expire(0);
    session_cache_limiter('nocache');
} else {
    session_cache_expire(180);
    session_cache_limiter('private');
}

// 2. session_start()の前に設定
session_cache_expire(30);
session_start();

// 3. 設定の確認
$expire = session_cache_expire();
echo "Current: {$expire} minutes";

関連関数:

  • session_cache_limiter(): キャッシュリミッター設定
  • session_start(): セッション開始
  • ini_get('session.cache_expire'): php.iniの設定取得
  • header(): HTTPヘッダー送信

session_cache_expire()は、セッションページのキャッシュ動作を細かく制御できる重要な関数です。セキュリティとパフォーマンスのバランスを取るために適切に設定しましょう!

タイトルとURLをコピーしました