【PHP8.x】clearstatcache関数の使い方

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

作成日: 更新日:

基本的な使い方

clearstatcache関数は、PHPがファイルに関する情報を内部的にキャッシュしている内容をクリアする関数です。PHPは、filesize()file_exists()is_readable()といったファイルシステム関連の関数を呼び出した際、ファイルのサイズや存在の有無などの状態情報を一定期間記憶しています。これは、同じファイルに対してこれらの関数を繰り返し呼び出す際に、実際にディスクにアクセスする回数を減らし、アプリケーションのパフォーマンスを向上させるための仕組みです。

しかし、PHPが起動している間に、別のプログラムやユーザーによってファイルが変更されたり、削除されたりすることがあります。このような外部からの変更が発生した場合、PHPが記憶しているファイルの情報は古くなり、現在のファイルの状態と一致しなくなる可能性があります。例えば、ファイルが外部から削除されたにもかかわらず、PHPの内部キャッシュがそのファイルは存在すると記憶していると、その後の処理で予期せぬ結果を引き起こすことがあります。

clearstatcache()関数を呼び出すと、PHPの内部に記憶されているファイルに関する状態情報キャッシュが強制的に破棄されます。これにより、次にfilesize()などのファイルシステム関連関数が呼び出された際には、キャッシュされた古い情報ではなく、ファイルシステムから直接、最新のファイルの状態が取得されるようになります。この関数は、ファイルシステムが頻繁に外部から変更されるような環境で、常に最新のファイル情報を確実に取得したい場合に利用されます。

構文(syntax)

1clearstatcache();

引数(parameters)

?bool $clear_realpath_cache = null, ?string $filename = null

  • bool $clear_realpath_cache = null: realpath() キャッシュをクリアするかどうかを指定します。true を指定すると、realpath() のキャッシュがクリアされます。
  • string $filename = null: 特定のファイルパスの stat キャッシュのみをクリアする場合に、そのファイルパスを指定します。

戻り値(return)

void

clearstatcache関数は、ファイルの状態情報をキャッシュから削除します。この関数は、ファイルの状態情報(サイズ、更新日時など)をメモリ上に保持する仕組みをクリアするために使用されます。この関数は戻り値を持ちません。

サンプルコード

PHP clearstatcache の動作確認

1<?php
2
3/**
4 * clearstatcache 関数の動作を実演します。
5 *
6 * PHPはファイルに関する情報を内部的にキャッシュすることがあります。
7 * 外部の変更(別のプロセスによるファイル変更など)をPHPが認識するには、
8 * このキャッシュをクリアする必要がある場合があります。
9 * この関数は、その「キャッシュが効いていて情報が古い」という状況と、
10 * 「clearstatcache によって情報が最新になる」という状況を示します。
11 */
12function demonstrateClearstatcache(): void
13{
14    // 一時ファイルを作成し、初期内容を書き込みます。
15    $tempFile = 'clearstatcache_example.txt';
16    file_put_contents($tempFile, 'Initial content.');
17    echo "1. ファイル '{$tempFile}' を作成し、初期内容を書き込みました。\n";
18
19    // 初期のファイルサイズを取得し表示します。
20    // PHPはここでファイルサイズをキャッシュする可能性があります。
21    $initialSize = filesize($tempFile);
22    echo "2. 初期ファイルサイズ: " . $initialSize . " バイト。\n";
23
24    // 外部プロセスがファイルを変更したと仮定し、ファイルに内容を追記します。
25    file_put_contents($tempFile, ' Additional content.', FILE_APPEND);
26    echo "3. ファイルに新しい内容を追記しました。\n";
27
28    // clearstatcache() を呼ばずに再度ファイルサイズを取得します。
29    // PHPの内部キャッシュが更新されていない場合、ファイルサイズは変わらない可能性があります。
30    $sizeBeforeClearCache = filesize($tempFile);
31    echo "4. clearstatcache() を呼ぶ前のファイルサイズ: " . $sizeBeforeClearCache . " バイト (キャッシュにより古い情報の可能性あり)。\n";
32
33    // clearstatcache() を呼び出し、ファイルステータスキャッシュをクリアします。
34    // これにより、次にファイルシステム関数が呼ばれたときに、最新の情報をOSから取得するようになります。
35    // 引数として true を渡すと、realpath_cache もクリアされます。
36    // 特定のファイルのみクリアしたい場合は、第二引数にファイル名を指定します。
37    clearstatcache(false, $tempFile); // 特定のファイルキャッシュのみクリアする例。引数なしの場合、全てのキャッシュをクリア。
38    echo "5. clearstatcache() を呼び出し、ファイルキャッシュをクリアしました。\n";
39
40    // clearstatcache() を呼んだ後に再度ファイルサイズを取得します。
41    // キャッシュがクリアされたため、最新のファイルサイズが取得されるはずです。
42    $sizeAfterClearCache = filesize($tempFile);
43    echo "6. clearstatcache() を呼んだ後のファイルサイズ: " . $sizeAfterClearCache . " バイト (最新の情報)。\n";
44
45    // ファイルサイズが更新されたことを確認します。
46    if ($sizeAfterClearCache > $initialSize) {
47        echo "7. ファイルサイズが正しく更新されました。clearstatcache が機能しました。\n";
48    } else {
49        echo "7. ファイルサイズが更新されませんでした。予期せぬ問題が発生した可能性があります。\n";
50    }
51
52    // 後処理として一時ファイルを削除します。
53    unlink($tempFile);
54    echo "8. 一時ファイル '{$tempFile}' を削除しました。\n";
55}
56
57// 関数の実行
58demonstrateClearstatcache();

PHPのclearstatcache関数は、ファイルに関する情報をPHPの内部キャッシュからクリアするために使用されます。PHPはfilesize()filemtime()といったファイルシステム関連の関数を呼び出した際、パフォーマンス向上のためにその結果を一定期間内部にキャッシュすることがあります。このため、PHPプロセスが起動している間に、別のプロセスなどによってファイルが変更されたとしても、PHPが古いキャッシュ情報を参照し続けてしまい、最新のファイル情報が取得できない場合があります。

clearstatcache関数を呼び出すことで、この内部キャッシュが強制的に破棄され、次にファイルシステム関数が実行される際にOSから最新の情報を再取得するようになります。引数$clear_realpath_cachetrueを指定すると、ファイルパスの解決に関するキャッシュ(realpath_cache)も同時にクリアされます。また、$filenameに特定のファイル名を指定することで、そのファイルに関するキャッシュのみをクリアすることも可能です。引数を指定しない場合や両方nullの場合は、全てのファイルに関するキャッシュがクリアされます。戻り値はvoidで、特に値は返しません。

サンプルコードでは、ファイル内容を追記した後、clearstatcache関数を呼ばない状態と呼んだ後のファイルサイズを比較することで、キャッシュによる情報の古さ、そしてキャッシュクリアによって最新のファイル情報が取得できる挙動を具体的に示しています。これにより、ファイル情報が期待通りに更新されない問題の解決に役立ちます。

PHPはファイル情報を内部的にキャッシュするため、filesizeなどの関数が古い情報を返すことがあります。clearstatcacheは、このキャッシュをクリアし、次にファイルシステム関数が呼ばれた際に最新の情報を取得させる関数です。外部からのファイル変更がPHPに反映されない場合に役立ちます。trueを渡すとrealpathキャッシュも、第二引数で特定のファイルのみキャッシュをクリア可能です。引数なしで呼ぶと全てのキャッシュをクリアしますので、利用範囲に注意しましょう。

clearstatcache() で PHP ファイルキャッシュをクリアする

1<?php
2
3/**
4 * clearstatcache() 関数の動作をデモンストレーションするサンプルコード。
5 * ファイルの作成、削除、そして clearstatcache() を使用して
6 * PHPのファイルステータスキャッシュをクリアする方法を示します。
7 */
8
9// テスト用の一時ファイルパス
10$testFilePath = 'temp_file_for_cache_test.txt';
11
12echo "--- clearstatcache() の動作確認 ---\n\n";
13
14// 1. テストファイルを作成します
15echo "1. テストファイルを作成します: '{$testFilePath}'\n";
16file_put_contents($testFilePath, "これはテスト内容です。\n");
17// ファイルが確実に存在するか確認
18if (file_exists($testFilePath)) {
19    echo "   → ファイルは正常に作成されました。\n";
20} else {
21    echo "   → エラー: ファイルの作成に失敗しました。\n";
22    exit(1); // 処理を終了
23}
24echo "\n";
25
26// 2. file_exists() でファイルの存在を確認します (この時点では存在するはず)
27echo "2. file_exists() でファイルの存在を確認 (作成直後):\n";
28if (file_exists($testFilePath)) {
29    echo "   → '{$testFilePath}' は存在すると判断されます。\n";
30} else {
31    echo "   → '{$testFilePath}' は存在しないと判断されます (予期せぬ結果)。\n";
32}
33echo "\n";
34
35// 3. テストファイルを削除します
36echo "3. テストファイルを削除します: '{$testFilePath}'\n";
37unlink($testFilePath);
38// ファイルが削除されたことを確認(ただしPHPのキャッシュに注意)
39if (!file_exists($testFilePath)) {
40    echo "   → ファイルはシステムから削除されました。\n";
41} else {
42    echo "   → エラー: ファイルの削除に失敗したか、キャッシュが残っています。\n";
43}
44echo "\n";
45
46// 4. file_exists() で再度ファイルの存在を確認します
47//    PHPのファイルステータスキャッシュが効いている場合、ファイルは存在すると誤って判断される可能性があります。
48echo "4. file_exists() でファイルの存在を再度確認 (削除直後、clearstatcache() 呼び出し前):\n";
49if (file_exists($testFilePath)) {
50    echo "   → '{$testFilePath}' はまだ存在すると判断されます (PHPのキャッシュによる可能性が高い)。\n";
51} else {
52    echo "   → '{$testFilePath}' は存在しないと正しく判断されました。\n";
53}
54echo "\n";
55
56// 5. clearstatcache() を呼び出してPHPのファイルステータスキャッシュをクリアします
57echo "5. clearstatcache() を呼び出して、PHPのファイルステータスキャッシュをクリアします。\n";
58clearstatcache();
59echo "\n";
60
61// 6. clearstatcache() 呼び出し後、file_exists() で最終確認します
62//    キャッシュがクリアされたため、ファイルは存在しないと正しく判断されるはずです。
63echo "6. clearstatcache() 呼び出し後、file_exists() で最終確認:\n";
64if (file_exists($testFilePath)) {
65    echo "   → '{$testFilePath}' はまだ存在すると判断されます (キャッシュがクリアされていません)。\n";
66} else {
67    echo "   → '{$testFilePath}' は存在しないと正しく判断されました。\n";
68}
69echo "\n";
70
71// 後処理: もしファイルが何らかの理由で残っていたら削除
72if (file_exists($testFilePath)) {
73    unlink($testFilePath);
74    echo "後処理: 残っていたファイル '{$testFilePath}' を削除しました。\n";
75}
76
77?>

PHPのclearstatcache()関数は、file_exists()filesize()などのファイルステータス関連の関数が利用する、PHP内部のファイル情報キャッシュをクリアするために使われます。PHPは一度取得したファイルの情報を一定時間保持することで、処理の高速化を図っています。

サンプルコードでは、まずtemp_file_for_cache_test.txtを作成し、file_exists()でその存在を確認します。その後、unlink()でファイルを削除しますが、直後のfile_exists()の呼び出しでは、PHPのキャッシュが残っているため、実際にはファイルが存在しないにもかかわらず「存在する」と誤って判断される場合があります。

ここでclearstatcache()を呼び出すと、PHPのファイルステータスキャッシュが強制的にクリアされます。その結果、再度file_exists()を実行すると、キャッシュがクリアされているため、ファイルの実際の状態が反映され、「存在しない」と正しく判断されることが確認できます。

この関数は、$clear_realpath_cacheという引数でrealpathキャッシュもクリアするかどうか、$filenameという引数で特定のファイルのキャッシュのみをクリアするかどうかを指定できますが、これらはどちらも省略可能です。戻り値はvoidであり、何も返しません。ファイルが頻繁に作成、更新、削除される環境で、常に最新のファイル情報を正確に取得したい場合に利用します。

PHPはファイルの存在やサイズなどの情報を一時的にキャッシュすることがあります。そのため、file_existsのような関数は、ファイルが実際に削除された後でも、古いキャッシュ情報を参照して「ファイルが存在する」と誤って判断する場合があります。clearstatcache()関数は、このPHP内部のファイルステータスキャッシュを強制的にクリアし、次にファイル情報を取得する際に最新の状態を参照させるために使用されます。長時間のスクリプト実行中にファイルが外部から変更されたり、同じスクリプト内でファイルを操作した直後に正確な状態を確認したい場合に特に重要です。この関数は結果を返さない(void)ため、戻り値をチェックする必要はありません。

関連コンテンツ

【PHP8.x】clearstatcache関数の使い方 | いっしー@Webエンジニア