[PHP]OPcacheの効果を確認!opcache_is_script_cached関数の使い方と活用例

PHP

はじめに

PHPのパフォーマンス向上において重要な役割を果たすOPcache。しかし、実際にスクリプトがキャッシュされているかどうかを確認したいと思ったことはありませんか?

そんな時に便利なのが opcache_is_script_cached 関数です。この記事では、この関数の基本的な使い方から実践的な活用例まで、詳しく解説していきます。

opcache_is_script_cached関数とは

opcache_is_script_cached は、指定されたPHPスクリプトがOPcacheにキャッシュされているかどうかを確認できる関数です。

基本構文

bool opcache_is_script_cached(string $filename)

パラメータ

  • $filename (string): チェックしたいPHPファイルのパス

戻り値

  • true: スクリプトがキャッシュされている
  • false: スクリプトがキャッシュされていない、またはOPcacheが無効

使用例

基本的な使用例

<?php
// 現在のスクリプト自体がキャッシュされているかチェック
if (opcache_is_script_cached(__FILE__)) {
    echo "このスクリプトはキャッシュされています";
} else {
    echo "このスクリプトはキャッシュされていません";
}

// 他のファイルをチェック
$target_file = '/path/to/your/script.php';
if (opcache_is_script_cached($target_file)) {
    echo "{$target_file} はキャッシュされています";
} else {
    echo "{$target_file} はキャッシュされていません";
}
?>

複数ファイルの一括チェック

<?php
function checkCacheStatus($files) {
    foreach ($files as $file) {
        $status = opcache_is_script_cached($file) ? 'キャッシュ済み' : '未キャッシュ';
        echo basename($file) . ": {$status}\n";
    }
}

$important_files = [
    '/var/www/html/index.php',
    '/var/www/html/config.php',
    '/var/www/html/functions.php'
];

checkCacheStatus($important_files);
?>

実践的な活用シーン

1. デバッグとパフォーマンス監視

<?php
function debugCacheInfo($script_path) {
    echo "=== OPcache状況確認 ===\n";
    echo "ファイル: " . basename($script_path) . "\n";
    echo "パス: {$script_path}\n";
    
    if (function_exists('opcache_is_script_cached')) {
        if (opcache_is_script_cached($script_path)) {
            echo "ステータス: ✅ キャッシュされています\n";
        } else {
            echo "ステータス: ❌ キャッシュされていません\n";
        }
    } else {
        echo "ステータス: ⚠️ OPcacheが無効または利用不可\n";
    }
    echo "========================\n";
}

// 使用例
debugCacheInfo(__FILE__);
?>

2. Webアプリケーションでの動的チェック

<?php
class OPcacheMonitor {
    public static function getCacheReport($file_list) {
        $report = [];
        
        foreach ($file_list as $file) {
            if (file_exists($file)) {
                $report[] = [
                    'file' => $file,
                    'cached' => opcache_is_script_cached($file),
                    'size' => filesize($file),
                    'modified' => filemtime($file)
                ];
            }
        }
        
        return $report;
    }
    
    public static function displayReport($report) {
        echo "<table border='1'>\n";
        echo "<tr><th>ファイル名</th><th>キャッシュ状況</th><th>サイズ</th><th>更新日時</th></tr>\n";
        
        foreach ($report as $item) {
            $cached_status = $item['cached'] ? '✅ キャッシュ済み' : '❌ 未キャッシュ';
            $file_name = basename($item['file']);
            $size = number_format($item['size']) . ' bytes';
            $modified = date('Y-m-d H:i:s', $item['modified']);
            
            echo "<tr>";
            echo "<td>{$file_name}</td>";
            echo "<td>{$cached_status}</td>";
            echo "<td>{$size}</td>";
            echo "<td>{$modified}</td>";
            echo "</tr>\n";
        }
        
        echo "</table>\n";
    }
}

// 使用例
$files_to_check = glob('*.php');
$report = OPcacheMonitor::getCacheReport($files_to_check);
OPcacheMonitor::displayReport($report);
?>

注意点とベストプラクティス

注意点

  1. OPcacheが無効な場合: OPcache拡張が無効の場合、この関数は常にfalseを返します
  2. ファイルパスの指定: 絶対パスでの指定が推奨されます
  3. 権限: ファイルにアクセス権限がない場合、正確な結果が得られない可能性があります

ベストプラクティス

<?php
function safeCacheCheck($file_path) {
    // 1. OPcache拡張の確認
    if (!extension_loaded('opcache')) {
        return ['status' => 'extension_not_loaded', 'message' => 'OPcache拡張が読み込まれていません'];
    }
    
    // 2. OPcacheが有効かチェック
    if (!opcache_get_status()) {
        return ['status' => 'opcache_disabled', 'message' => 'OPcacheが無効です'];
    }
    
    // 3. ファイルの存在確認
    if (!file_exists($file_path)) {
        return ['status' => 'file_not_found', 'message' => 'ファイルが見つかりません'];
    }
    
    // 4. 絶対パスに変換
    $absolute_path = realpath($file_path);
    
    // 5. キャッシュ状況をチェック
    $is_cached = opcache_is_script_cached($absolute_path);
    
    return [
        'status' => 'success',
        'cached' => $is_cached,
        'path' => $absolute_path,
        'message' => $is_cached ? 'キャッシュされています' : 'キャッシュされていません'
    ];
}

// 安全な使用例
$result = safeCacheCheck('example.php');
echo $result['message'];
?>

パフォーマンスへの影響

opcache_is_script_cached 関数自体は軽量な処理ですが、大量のファイルを一度にチェックする場合は以下の点に注意してください:

<?php
// 効率的な一括チェック
function efficientBatchCheck($file_patterns) {
    $results = [];
    
    foreach ($file_patterns as $pattern) {
        $files = glob($pattern);
        
        foreach ($files as $file) {
            // リアルパスを一度だけ取得
            $real_path = realpath($file);
            if ($real_path) {
                $results[$real_path] = opcache_is_script_cached($real_path);
            }
        }
    }
    
    return $results;
}

// 使用例
$patterns = ['*.php', 'includes/*.php', 'classes/*.php'];
$cache_results = efficientBatchCheck($patterns);

foreach ($cache_results as $file => $is_cached) {
    echo basename($file) . ': ' . ($is_cached ? 'キャッシュ済み' : '未キャッシュ') . "\n";
}
?>

まとめ

opcache_is_script_cached 関数は、PHPアプリケーションのパフォーマンス最適化において重要なツールです。

主な活用場面:

  • デバッグ時のキャッシュ状況確認
  • パフォーマンス監視
  • デプロイ後の動作確認
  • アプリケーションの健康状態チェック

この関数を適切に活用することで、OPcacheの効果を可視化し、PHPアプリケーションのパフォーマンス向上に役立てることができます。ぜひ日々の開発・運用業務に取り入れてみてください。


この記事がPHPのパフォーマンス改善の参考になれば幸いです。OPcacheの設定や他の関数についても、今後の記事で詳しく解説予定です。

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