Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】opcache_invalidate()関数の使い方

opcache_invalidate関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

opcache_invalidate関数は、指定されたスクリプトまたはスクリプトパスに対応するOPcacheのエントリを無効化する関数です。OPcacheは、PHPスクリプトをコンパイルした結果をメモリにキャッシュすることで、PHPの実行速度を向上させる拡張モジュールです。

この関数を使用することで、ファイルの内容が変更された場合に、キャッシュされた古いバージョンのスクリプトを強制的に再コンパイルさせることができます。これにより、変更が即座に反映されるようになります。

具体的には、opcache_invalidate(string $script, bool $force = false): bool という形式で使用します。$script引数には、無効化したいスクリプトのパスを指定します。$force引数はオプションで、デフォルトは false です。true を指定すると、スクリプトが実行中であっても強制的に無効化します。通常は false で十分ですが、どうしてもキャッシュが更新されない場合に true を試すことができます。

この関数は、OPcacheが有効になっている場合にのみ機能します。OPcacheが無効になっている場合、この関数を呼び出しても何も起こりません。また、関数が成功した場合は true 、失敗した場合は false を返します。

システムエンジニアとして、例えばデプロイ時にスクリプトファイルを更新した後、この関数を使ってOPcacheを無効化することで、ユーザーに最新の変更を確実に反映させることができます。これにより、キャッシュによる表示の不整合を防ぎ、安定したシステム運用に貢献できます。

構文(syntax)

1opcache_invalidate(string $filename, bool $force = false): bool

引数(parameters)

string $filename, bool $force = false

  • string $filename: 無効化するPHPスクリプトのファイルパスを指定します。
  • bool $force = false: trueを指定すると、キャッシュされているスクリプトが強制的に無効化されます。

戻り値(return)

bool

opcache_invalidate関数は、OpCacheから指定されたスクリプトのエントリを無効にできるかを判定します。無効化が成功した場合はtrueを、失敗した場合はfalseを返します。

サンプルコード

PHP OPcache キャッシュ無効化の実行

1<?php
2
3/**
4 * OPcacheのキャッシュを無効化するサンプルコード。
5 *
6 * このスクリプトは、特定のファイルのOPcacheキャッシュを無効化する方法を示します。
7 * OPcacheはPHPスクリプトの実行速度を向上させるための機能ですが、
8 * コードを更新した際に古いキャッシュが使われ続けることを防ぐために、
9 * キャッシュを無効化する必要がある場合があります。
10 *
11 * システムエンジニアを目指す初心者の方へ:
12 * opcache_invalidate 関数は、主にデプロイ時(新しいコードを本番環境に反映する際)に利用されます。
13 * これにより、WebサーバーがPHPコードの最新バージョンを使用するように強制できます。
14 */
15
16/**
17 * OPcacheキャッシュの無効化プロセス全体を実行します。
18 *
19 * 一時ファイルを生成し、そのファイルのOPcacheキャッシュを無効化する一連の処理を行います。
20 * この関数は、`opcache_invalidate` の基本的な使い方と、OPcacheが有効かどうかを
21 * 確認する方法を示します。
22 *
23 * @return void
24 */
25function runOpcacheInvalidationExample(): void
26{
27    // OPcacheがPHPにロードされており、有効になっているかを確認します。
28    // php.iniで 'opcache.enable=1' と設定されている必要があります。
29    if (!extension_loaded('opcache') || !ini_get('opcache.enable')) {
30        echo "OPcacheが有効になっていません。opcache_invalidateは動作しません。\n";
31        echo "php.iniで 'opcache.enable=1' を設定し、Webサーバーを再起動してください。\n";
32        return;
33    }
34
35    // キャッシュ無効化のテスト用に一時的なPHPファイルを作成します。
36    // __DIR__ は現在のスクリプトが置かれているディレクトリを指します。
37    $tempFileName = __DIR__ . DIRECTORY_SEPARATOR . 'temp_opcache_test.php';
38    $fileContent = <<<'PHP_CODE'
39<?php
40// これはOPcacheによってキャッシュされる可能性のある一時ファイルです。
41echo "このファイルはOPcacheのテスト用です。\n";
42PHP_CODE;
43
44    // 一時ファイルを作成します。
45    if (file_put_contents($tempFileName, $fileContent) === false) {
46        echo "エラー: 一時ファイルの作成に失敗しました: {$tempFileName}\n";
47        return;
48    }
49    echo "一時ファイル '{$tempFileName}' を作成しました。\n";
50
51    // 一度ファイルをインクルード(読み込み)することで、OPcacheにキャッシュされる可能性を高めます。
52    // 実際のWebアプリケーションでは、Webサーバー経由でファイルにアクセスされることでキャッシュされます。
53    // '@' はエラー抑制演算子で、ファイルが見つからない場合などの警告表示を防ぎます。
54    @include $tempFileName;
55    echo "一時ファイルを一度読み込み、OPcacheにキャッシュされる可能性を高めました。\n";
56
57    // opcache_invalidate 関数を呼び出して、指定されたファイルのOPcacheキャッシュを無効化します。
58    // 第二引数 `true` は、ファイルが現在メモリにロードされている場合でも、
59    // 強制的にキャッシュを無効化することを示します。これはデプロイ時に非常に有用です。
60    $success = opcache_invalidate($tempFileName, true);
61
62    if ($success) {
63        echo "ファイル '{$tempFileName}' のOPcacheキャッシュが無効化されました。\n";
64    } else {
65        echo "エラー: ファイル '{$tempFileName}' のOPcacheキャッシュを無効化できませんでした。\n";
66        echo "ファイルへのアクセス権限やOPcacheの設定を確認してください。\n";
67    }
68
69    // テスト後に作成した一時ファイルを削除します。
70    if (file_exists($tempFileName)) {
71        if (unlink($tempFileName)) {
72            echo "一時ファイル '{$tempFileName}' を削除しました。\n";
73        } else {
74            echo "エラー: 一時ファイル '{$tempFileName}' の削除に失敗しました。\n";
75        }
76    }
77
78    // 全体的な操作結果を表示します。
79    if ($success) {
80        echo "OPcache無効化の操作は成功しました。\n";
81    } else {
82        echo "OPcache無効化の操作は失敗しました。\n";
83    }
84}
85
86// サンプルコードを実行します。
87runOpcacheInvalidationExample();
88

PHPのopcache_invalidate関数は、Webサイトの高速化に貢献するOPcacheのキャッシュを、指定したPHPファイルに対して無効化するために利用されます。OPcacheは、PHPスクリプトを一度解析・最適化された形式でメモリに保存することで、その後の実行速度を向上させます。しかし、コードを更新した際に、古いキャッシュが残り続け、新しい変更がWebサーバーに反映されないことがあります。このような場合にこの関数が活躍します。

この関数は、キャッシュを無効化したいPHPファイルのパスを第一引数$filenameに文字列として指定します。第二引数$forceはオプションで、デフォルトはfalseです。この引数をtrueに設定すると、対象のファイルが現在OPcacheによってメモリにロードされている場合でも、強制的にキャッシュを無効化します。これは、新しいコードを本番環境にデプロイする際などに非常に有用です。関数は、キャッシュの無効化に成功すればtrueを、失敗すればfalseをブール値として返します。

サンプルコードでは、まずOPcacheが有効になっているかを確認し、一時ファイルを作成して疑似的にキャッシュされる状況を作り出します。その後、opcache_invalidate関数をtrue$force引数と共に呼び出し、キャッシュが確実に無効化されるプロセスを示しています。システムエンジニアとして、デプロイ時に最新のコードがWebサーバーで確実に使用されるよう、この関数を適切に利用することは大切なスキルの一つです。

opcache_invalidateは、PHPのOPcache拡張が有効な環境でのみ機能します。この関数を利用する前に、必ずphp.iniopcache.enable=1が設定されているか、またPHPがOPcache拡張を読み込んでいるか確認してください。

第二引数にtrueを指定すると、ファイルが現在メモリにロードされている場合でも、そのキャッシュを強制的に無効化できます。本番環境でのデプロイ時など、古いコードのキャッシュが残り続けないよう、この引数をtrueに設定することが推奨されます。

キャッシュを無効化したいファイルの正確なパスを指定することが重要です。また、PHPプロセスがそのファイルに対する適切なアクセス権限を持っていることも確認してください。この関数は主にコード更新時など、PHPスクリプトのキャッシュを意図的にクリアしたい場合に利用し、不必要な呼び出しは避けるようにしてください。

PHP Opcache ファイルキャッシュ無効化する

1<?php
2
3/**
4 * Opcacheの状態を確認し、指定されたファイルのキャッシュを無効化するサンプルコード。
5 *
6 * opcache_invalidate 関数は、PHPのOpcacheにキャッシュされている特定のファイルの
7 * バイトコードキャッシュを強制的に無効化し、次回アクセス時に再コンパイルさせます。
8 * これは、デプロイ時に古いキャッシュが残ることを防ぎたい場合などに役立ちます。
9 *
10 * 実行する前に、php.ini で Opcache を有効にし、CLI 環境でテストする場合は
11 * 'opcache.enable_cli=1' の設定も必要です。
12 */
13
14/**
15 * Opcacheの現在の状態、または特定のファイルのキャッシュ状態を表示します。
16 *
17 * @param string $filename 確認対象のファイルパス(オプション)。
18 *                         指定しない場合、Opcache全体のステータスを表示します。
19 */
20function checkOpcacheStatus(string $filename = ''): void
21{
22    // Opcache拡張がロードされているか確認
23    if (!extension_loaded('Zend OPcache')) {
24        echo "⛔ Opcache は有効ではありません。php.ini で 'zend_extension=opcache.so' を有効にしてください。\n";
25        echo "   CLI 環境でテストする場合は 'opcache.enable_cli=1' の設定も必要です。\n";
26        return;
27    }
28
29    // Opcacheの全体的なステータスを取得 (true を指定するとスクリプトごとの詳細情報も取得)
30    $status = opcache_get_status(true);
31
32    // Opcacheが有効化されているか確認 (php.ini の opcache.enable=1 または opcache.enable_cli=1)
33    if (!($status['opcache_enabled'] ?? false)) {
34        echo "⛔ Opcache は有効ですが、opcache.enable または opcache.enable_cli が '0' に設定されている可能性があります。\n";
35        echo "   CLI 環境でテストする場合は 'opcache.enable_cli=1' の設定を確認してください。\n";
36        return;
37    }
38
39    echo "✅ Opcache は有効です。\n";
40    echo "----------------------------------------\n";
41
42    // 特定のファイルパスが指定された場合、そのファイルのキャッシュ情報を表示
43    if ($filename && isset($status['scripts'][$filename])) {
44        echo "ファイル '{$filename}' のキャッシュ情報:\n";
45        $fileInfo = $status['scripts'][$filename];
46        echo "  - キャッシュされている: はい\n";
47        echo "  - バイトコードサイズ: " . round($fileInfo['memory_consumption'] / 1024, 2) . " KB\n";
48        echo "  - 最終更新タイムスタンプ: " . date('Y-m-d H:i:s', $fileInfo['timestamp']) . "\n";
49        echo "  - 使用回数: " . $fileInfo['hits'] . "\n";
50    } elseif ($filename) {
51        echo "ファイル '{$filename}' はキャッシュされていません。\n";
52    } else {
53        // ファイルパスが指定されていない場合、Opcache全体のサマリーを表示
54        echo "全体の Opcache ステータス:\n";
55        echo "  - 使用済みメモリ: " . round($status['memory_usage']['used_memory'] / (1024 * 1024), 2) . " MB\n";
56        echo "  - 空きメモリ: " . round($status['memory_usage']['free_memory'] / (1024 * 1024), 2) . " MB\n";
57        echo "  - キャッシュされたファイル数: " . $status['opcache_statistics']['num_cached_scripts'] . "\n";
58    }
59    echo "----------------------------------------\n";
60}
61
62// --------------------------------------------------
63// メイン処理
64// --------------------------------------------------
65
66echo "=== 1. Opcache の初期状態を確認 ===\n";
67checkOpcacheStatus();
68
69// Opcache が有効でない場合は以降のテストをスキップ
70if (!extension_loaded('Zend OPcache') || !(opcache_get_status(false)['opcache_enabled'] ?? false)) {
71    echo "Opcache が有効でないため、キャッシュ無効化のテストはスキップします。\n";
72    exit(1);
73}
74
75// テスト用の PHP ファイルを作成
76$testFilePath = __DIR__ . '/opcache_example_file.php';
77$initialContent = '<?php echo "これは Opcache テストファイルです。バージョン 1\\n";';
78file_put_contents($testFilePath, $initialContent);
79echo "テストファイル '{$testFilePath}' を作成しました。\n";
80
81// ファイルが存在することを確認
82if (!file_exists($testFilePath)) {
83    echo "エラー: テストファイル '{$testFilePath}' の作成に失敗しました。\n";
84    exit(1);
85}
86
87echo "\n=== 2. 作成したファイルを Opcache にコンパイルしてキャッシュさせる ===\n";
88// opcache_compile_file() で明示的にファイルをOpcacheにロードし、コンパイルさせます。
89// `opcache.enable_cli=1` が設定されていないと、CLI環境ではこの関数は機能しないことがあります。
90$compiled = opcache_compile_file($testFilePath);
91if ($compiled) {
92    echo "ファイル '{$testFilePath}' を Opcache にコンパイルしました。\n";
93} else {
94    echo "エラー: ファイル '{$testFilePath}' を Opcache にコンパイルできませんでした。\n";
95    echo "  Opcache の設定 (特に 'opcache.enable_cli=1') を確認してください。\n";
96    unlink($testFilePath); // テストファイルを削除
97    exit(1);
98}
99
100echo "\n=== 3. キャッシュ後の状態を確認 ===\n";
101checkOpcacheStatus($testFilePath);
102
103echo "\n=== 4. opcache_invalidate を使ってキャッシュを無効化 ===\n";
104echo "ファイル '{$testFilePath}' のキャッシュを無効化します...\n";
105// opcache_invalidate を呼び出し、指定されたファイルのキャッシュを無効化します。
106// 第二引数 `true` は、ファイルがOpcacheにキャッシュされているかどうかに関わらず、
107// 強制的に無効化することを指示します。
108$invalidateSuccess = opcache_invalidate($testFilePath, true);
109
110if ($invalidateSuccess) {
111    echo "✅ キャッシュの無効化に成功しました。\n";
112    echo "   opcache_invalidate はキャッシュエントリ自体を削除するのではなく、\n";
113    echo "   次回このファイルが実行される際に強制的に再コンパイルさせるようマークします。\n";
114} else {
115    echo "❌ キャッシュの無効化に失敗しました。ファイルが存在しないか、Opcacheが有効でない可能性があります。\n";
116}
117
118echo "\n=== 5. 無効化後の Opcache ステータスを再度確認 ===\n";
119checkOpcacheStatus($testFilePath);
120echo "  上記のステータスでは 'キャッシュされている' と表示される場合がありますが、\n";
121echo "  これはキャッシュエントリがまだOpcacheのリストに残っていることを示します。\n";
122echo "  しかし、opcache_invalidate により、次にこのファイルが実行される際には、\n";
123echo "  Opcache は古いバイトコードを使わずにファイルを再コンパイルします。\n";
124
125// テストファイルを削除してクリーンアップ
126unlink($testFilePath);
127echo "\nテストファイル '{$testFilePath}' を削除しました。\n";

opcache_invalidate関数は、PHPのOpcacheにキャッシュされている特定のファイルのバイトコードキャッシュを無効化するために使用されます。これにより、次回そのファイルにアクセスした際に、Opcacheは古いバイトコードを使用せず、ファイルを再コンパイルして新しいキャッシュを作成します。この機能は、システムデプロイ時などに、新しいバージョンのファイルがOpcacheの古いキャッシュによって実行されてしまうことを防ぎたい場合に特に役立ちます。

引数$filenameには、キャッシュを無効化したいファイルの絶対パスを指定します。オプションの引数$forcetrueを指定すると、指定されたファイルがOpcacheにキャッシュされているかどうかに関わらず、強制的に無効化を試みます。関数は処理が成功した場合はtrueを、失敗した場合はfalseを返します。

提供されたサンプルコードでは、まずOpcacheが有効かを確認し、テスト用のPHPファイルを作成します。次にopcache_compile_file関数でそのファイルをOpcacheに明示的にキャッシュさせ、その状態を確認します。その後、opcache_invalidatetrue$force引数と共に呼び出し、ファイルのキャッシュを無効化します。無効化後もOpcacheのステータスを再確認し、キャッシュエントリ自体はまだリストに残っているものの、次回実行時には再コンパイルされる挙動を示しています。この関数を使用するには、php.iniでOpcacheが有効化されており、CLI環境でテストする場合はopcache.enable_cli=1の設定が必要です。

opcache_invalidateは、PHPのOpcacheにキャッシュされた特定のファイルを次回実行時に強制的に再コンパイルさせる関数です。デプロイ後などに古いキャッシュが残るのを防ぐ際に使用します。

利用する際は、まずphp.iniでOpcacheが有効になっているか、特にCLI環境でテストする場合はopcache.enable_cli=1の設定が必須です。この関数はキャッシュエントリを即座に削除するのではなく、次回アクセス時に再コンパイルを促すマークを付けるため、直後にopcache_get_statusで確認しても、ファイルがキャッシュ内に残っていると表示される場合がありますが、これは意図された動作です。本番環境での利用は、ファイルの更新時など特定の状況に限定し、指定するファイルパスは正確に記述するようにしてください。

関連コンテンツ

関連IT用語