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

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

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

作成日: 更新日:

基本的な使い方

fstat関数は、既に開かれているファイルリソース(ファイルポインタ)から、そのファイルに関する詳細な統計情報を取得する関数です。この関数は、fopen()などで開かれたファイルリソースを引数として受け取ります。成功した場合、ファイルに関する様々な情報を含む配列を返します。

返される配列には、ファイルのサイズ、最終アクセス時刻、最終更新時刻、ファイルのパーミッション、所有者ID、グループIDといった多岐にわたる属性が含まれています。これらの情報は、数値インデックスと、より読みやすい連想配列キー(例えば、ファイルのバイト単位のサイズは['size'][7]でアクセス可能)の両方で提供されます。例えば、ファイルのサイズを確認したり、特定の日時以降に更新されたファイルを検出したりする際に役立ちます。

この関数は、ファイルの状態をプログラムで確認したい場合に非常に有用です。ファイルの読み書きを行う前に、そのファイルのサイズや権限を把握しておくことで、予期せぬエラーを防ぐことができます。ファイル情報の取得に失敗した場合はfalseを返すため、関数の呼び出し後には戻り値を必ず確認し、適切なエラーハンドリングを行うことが重要です。

構文(syntax)

1<?php
2$fileHandle = fopen('php://temp', 'r');
3$fileStatistics = fstat($fileHandle);
4fclose($fileHandle);
5?>

引数(parameters)

resource $stream

  • resource $stream: ファイルリソースやソケットリソースなどのファイルポインタを指定するリソース型

戻り値(return)

array|false

fstat関数は、指定されたファイルポインタに関連付けられたファイルの状態を示す配列、またはエラーが発生した場合はfalseを返します。

サンプルコード

PHP fstat 失敗と対処法

1<?php
2
3/**
4 * fstat関数の成功と失敗のケースを示すサンプルコード。
5 *
6 * システムエンジニアを目指す初心者向けに、ファイル操作における「fstat failed」
7 * の状況とそのハンドリングを理解できるよう、具体的なコード例を提供します。
8 *
9 * @param string $filePath ファイルの情報を取得する対象のパス
10 * @param bool $simulateFstatFailure fstatの失敗(閉じられたストリーム)を意図的にシミュレートするかどうか
11 */
12function demonstrateFstatHandling(string $filePath, bool $simulateFstatFailure = false): void
13{
14    echo "--- ファイル: '{$filePath}' の処理を開始 ---\n";
15
16    // 1. ファイルを開く試み
17    // 'r'モードで読み込み用に開きます。
18    // fopenが失敗した場合 (例: ファイルが存在しない、読み込み権限がない)、falseを返します。
19    // @ を付けることで、fopenが警告を出力するのを抑制し、戻り値のfalseでエラーを処理します。
20    $stream = @fopen($filePath, 'r');
21
22    if ($stream === false) {
23        echo "エラー: ファイル '{$filePath}' を開けませんでした。\n";
24        echo "  - ファイルが存在しないか、読み込み権限がない可能性があります。\n";
25        echo "--- ファイル: '{$filePath}' の処理を終了 ---\n\n";
26        return; // ファイルが開けなければ、以降の処理は不要
27    }
28
29    echo "ファイル '{$filePath}' を正常に開きました。\n";
30
31    // 2. 正常な fstat の呼び出し
32    echo "  - fstat でファイル情報を取得します。\n";
33    $stats = fstat($stream);
34
35    if ($stats === false) {
36        // 通常、fopenが成功していればfstatも成功するはずですが、万が一のためにエラーハンドリングは重要です。
37        echo "  エラー: fstat の呼び出しに失敗しました。(予期せぬ問題が発生した可能性があります)\n";
38        fclose($stream); // 開いたストリームは必ず閉じる
39        echo "--- ファイル: '{$filePath}' の処理を終了 ---\n\n";
40        return;
41    }
42
43    echo "  正常にファイル情報を取得しました。\n";
44    // 取得した統計情報の一部を表示
45    echo "    ファイルサイズ: " . ($stats['size'] ?? '不明') . " バイト\n";
46    echo "    最終変更時刻: " . date('Y-m-d H:i:s', $stats['mtime'] ?? 0) . "\n";
47    // その他の統計情報も $stats 配列に含まれます。
48
49    // 3. fstat の失敗を意図的にシミュレートするケース
50    // ここでは、既に閉じられたストリームに対してfstatを呼び出すことで、失敗を再現します。
51    if ($simulateFstatFailure) {
52        echo "\n  --- fstat 失敗のシミュレーション開始 (意図的に失敗させる) ---\n";
53
54        // ファイルを閉じる
55        fclose($stream);
56        echo "  ファイルを閉じました。\n";
57        
58        echo "  閉じられたストリームに対して fstat を呼び出します。\n";
59        // 閉じられたストリームに対して fstat を呼び出すと、PHPは警告を発生させ、fstatは false を返します。
60        // ここでも @ を付けて警告メッセージを抑制し、戻り値の false に注目します。
61        $failedStats = @fstat($stream);
62
63        if ($failedStats === false) {
64            echo "  成功: 閉じられたストリームに対する fstat の呼び出しは失敗しました。\n";
65            echo "  これは、fstat が無効なリソースに対して false を返す典型的な例です。\n";
66        } else {
67            echo "  エラー: 閉じられたストリームに対する fstat が予期せず成功しました。\n";
68        }
69        echo "  --- fstat 失敗のシミュレーション終了 ---\n";
70        
71        // このシミュレーションでは、ストリームは閉じられたままです。
72        // 通常のアプリケーションでは、エラー後に適切なリカバリ処理や終了処理を行います。
73    } else {
74        // シミュレーションを行わない場合は、ここでストリームを閉じる
75        fclose($stream);
76        echo "ファイルを閉じました。\n";
77    }
78
79    echo "--- ファイル: '{$filePath}' の処理を終了 ---\n\n";
80}
81
82// === 実行例 ===
83
84// 実行例1: 存在するファイルに対して正常な fstat を実行
85// テストファイルを作成
86$existingFile = 'test_fstat_example.txt';
87file_put_contents($existingFile, "このファイルは fstat 関数のテスト用です。");
88demonstrateFstatHandling($existingFile);
89
90// 実行例2: 存在しないファイルに対して fstat を実行 (fopen が失敗するケース)
91$nonExistentFile = 'non_existent_file_for_fstat.txt';
92demonstrateFstatHandling($nonExistentFile);
93
94// 実行例3: fstat の失敗を意図的にシミュレート (fclose 後に fstat を呼び出すケース)
95demonstrateFstatHandling($existingFile, true);
96
97// 後処理: 作成したテストファイルを削除
98if (file_exists($existingFile)) {
99    unlink($existingFile);
100}

PHPのfstat関数は、既に開いているファイルストリームから、そのファイルに関する詳細な情報を取得する際に使用します。引数にはfopen関数などで得られたファイルストリームリソースを渡します。関数が成功すると、ファイルサイズや最終更新日時などを含む配列が返され、失敗した場合はfalseが返されます。このサンプルコードは、fstat関数の基本的な使い方と、エラー発生時の適切な処理方法を具体的に示しています。ファイルが正常に開かれたストリームに対してfstatを呼び出し、情報を取得する成功例と、ファイルが既に閉じられている無効なストリームに対して呼び出し、falseが返される「fstat failed」の状況を再現しています。ファイル操作では様々な要因で処理が失敗する可能性があるため、戻り値がfalseでないかを常に確認し、適切なエラーハンドリングを行うことが、システムエンジニアにとって非常に重要であることをこのコードは伝えています。

ファイルを開いたら必ずfcloseで閉じ、リソースの解放を忘れないようにしましょう。fstat関数は、ファイルを開くことに失敗した場合や、既に閉じられたストリームに対して実行すると失敗し、falseを返します。必ず戻り値がfalseでないか厳密にチェックし、適切なエラー処理を記述することが重要です。@演算子で警告を抑制する際は、エラーが隠れてしまう可能性があるため、デバッグ時や本番環境での利用には特に注意が必要です。

PHP fstatでファイル統計情報を取得する

1<?php
2
3/**
4 * fstat関数の基本的な使用例
5 *
6 * fstat関数は、開かれたファイルポインタ(リソース)からファイルシステムに関する統計情報を取得します。
7 * 取得できる情報には、ファイルサイズ、パーミッション、最終変更時刻などがあります。
8 *
9 * キーワードとして「ftok」が指定されていますが、ftokはプロセス間通信(IPC)キーを生成する関数であり、
10 * fstatとは直接的な連携はありません。しかし、どちらの関数もファイルパスを扱いうるという点で
11 * 間接的な関連性があります。このサンプルコードでは、fstatの基本的な使い方を示し、
12 * ftokについては補足としてコメントアウトされた形で示します。
13 */
14function demonstrateFstatUsage(): void
15{
16    // このスクリプトファイル自身を対象として使用します。
17    $filePath = __FILE__;
18
19    // ファイルを読み込みモード ('r') で開きます。
20    // fstatはファイルポインタ(リソース)を引数として受け取るため、fopenでファイルを開く必要があります。
21    $fileHandle = fopen($filePath, 'r');
22
23    if ($fileHandle === false) {
24        echo "エラー: ファイル '{$filePath}' を開けませんでした。" . PHP_EOL;
25        return;
26    }
27
28    // fstat関数を呼び出してファイル統計情報を取得します。
29    // 成功した場合は連想配列、失敗した場合は false を返します。
30    $stats = fstat($fileHandle);
31
32    if ($stats === false) {
33        echo "エラー: ファイル統計情報の取得に失敗しました。" . PHP_EOL;
34    } else {
35        echo "--- ファイル統計情報 ---" . PHP_EOL;
36        echo "ファイルパス: {$filePath}" . PHP_EOL;
37        echo "サイズ: {$stats['size']} バイト" . PHP_EOL;
38        echo "inode番号: {$stats['ino']}" . PHP_EOL;
39        // パーミッションは通常、8進数表記で扱われるため、decoct関数とビットマスクを使用します。
40        echo "パーミッション: " . decoct($stats['mode'] & 0777) . PHP_EOL;
41        echo "最終変更時刻: " . date('Y-m-d H:i:s', $stats['mtime']) . PHP_EOL;
42        echo "ユーザーID: {$stats['uid']}" . PHP_EOL;
43        echo "グループID: {$stats['gid']}" . PHP_EOL;
44        // 他にも'dev', 'rdev', 'nlink', 'atime', 'ctime', 'blksize', 'blocks'などの情報が含まれます。
45    }
46
47    // 開いたファイルハンドルを閉じます。
48    fclose($fileHandle);
49
50    // --- キーワード「ftok」に関する補足 ---
51    // ftokは指定されたファイルパスとプロジェクト識別子からIPCキーを生成する関数です。
52    // fstatとは用途が異なりますが、もし同じファイルパスをIPCキーの生成に利用する場合の例です。
53    /*
54    $projectId = 'a'; // プロジェクト識別子 (1文字の文字列)
55    $ipcKey = ftok($filePath, $projectId);
56
57    if ($ipcKey === -1) {
58        echo "警告: IPCキーの生成に失敗しました (ftok)。" . PHP_EOL;
59    } else {
60        echo "IPCキー (ftok) を生成しました: {$ipcKey}" . PHP_EOL;
61    }
62    */
63}
64
65// 関数を実行してfstatの動作を確認します。
66demonstrateFstatUsage();

PHPのfstat関数は、すでに開かれているファイルポインタ(リソース)から、そのファイルシステムに関する統計情報を取得するために使用されます。この関数は、fopen関数などでファイルを開いた際に得られるファイルポインタを引数$streamとして受け取ります。

処理が成功した場合、fstat関数はファイルのサイズ、inode番号、パーミッション、最終変更時刻、所有者ID、グループIDなどの詳細情報を含む連想配列を返します。パーミッションは数値で取得されるため、8進数表記で確認するにはdecoct関数などと組み合わせて使用することが一般的です。ファイル情報の取得に失敗した場合にはfalseが返されるため、必ず戻り値を確認し、エラーハンドリングを行うことが重要です。

このサンプルコードでは、現在実行しているスクリプトファイル自身をfopenで読み込みモードで開き、そのファイルポインタをfstatに渡して統計情報を取得し表示しています。情報の取得後は、開いたファイルハンドルをfcloseで閉じることでリソースを解放します。

なお、キーワードとして指定されたftok関数は、ファイルパスとプロジェクト識別子からプロセス間通信(IPC)キーを生成する別の機能を持つ関数であり、fstatとは直接的な関連はありません。しかし、どちらの関数もファイルパスを起点とした情報を扱うという点で紹介いたしました。

fstat関数は、ファイルパスではなくfopenなどで開いたファイルハンドル(リソース)を引数に指定する必要があります。関数が失敗するとfalseを返すため、必ず戻り値をチェックし、適切にエラー処理を行うようにしてください。fopenで開いたファイルハンドルは、処理が完了したら必ずfcloseで閉じてリソースを解放することが重要です。解放を忘れると、メモリやシステムリソースを消費し続ける原因となります。取得できるパーミッション情報(mode)は数値ですが、一般的には8進数表記で解釈されます。キーワードのftokfstatとは異なる目的の関数で、プロセス間通信のキーを生成するものですので、混同しないよう注意してください。

関連コンテンツ

関連IT用語

関連プログラミング言語