【PHP8.x】GlobIterator::getCTime()メソッドの使い方
getCTimeメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
getCTimeメソッドは、ファイルシステム上を特定のパターンで反復処理を行うGlobIteratorクラスに属し、現在イテレータが指しているファイルのiノード最終変更時刻を取得するメソッドです。iノードとは、ファイルの内容や場所を示すデータブロックとは別に、ファイルのタイプ、パーミッション、所有者、最終更新日時などのメタ情報を記録している重要なデータ構造のことです。
このメソッドが取得する「iノード最終変更時刻 (ctime)」は、ファイルの内容そのものが変更された時刻(mtime: 最終更新時刻)とは異なります。具体的には、ファイルのパーミッション、所有者、またはファイル名などのメタデータが変更された場合に更新される時刻を指します。ファイルの内容変更だけでなく、ファイルの属性に関する変更履歴を追跡したい場合にgetCTimeは非常に役立ちます。
このメソッドは、指定されたファイルのiノード最終変更時刻をUnixタイムスタンプ(1970年1月1日00:00:00 UTCからの経過秒数を示す整数値)として返します。もしファイルの情報の取得に失敗した場合や、ファイルが存在しない場合はfalseを返すことがあります。取得したタイムスタンプは、PHPのdate()関数などと組み合わせて、人間が読みやすい形式の日時文字列に変換できます。システムの状態監視、セキュリティ監査、ファイルのライフサイクル管理など、多岐にわたる場面で、ファイルのメタデータ変更履歴を把握するために利用できます。
構文(syntax)
1<?php 2$globIterator = new GlobIterator(__DIR__ . '/*.php'); 3if ($globIterator->valid()) { 4 $creationTime = $globIterator->getCTime(); 5}
引数(parameters)
引数なし
引数はありません
戻り値(return)
int|false
GlobIterator::getCTime() は、ファイルが最後に変更された時刻を Unix タイムスタンプ(秒単位)で返します。エラーが発生した場合は false を返します。
サンプルコード
PHP GlobIterator::getCTimeでiノード変更時刻を取得する
1<?php 2 3/** 4 * GlobIterator::getCTime() の使用例を示します。 5 * このメソッドは、GlobIterator が指す現在のファイルまたはディレクトリの 6 * iノード変更時刻(ファイルのメタデータ変更時刻)をタイムスタンプとして取得します。 7 * 8 * システムエンジニアを目指す初心者の方へ: 9 * タイムスタンプとは、特定の日時を数値で表現したもので、 10 * 通常は1970年1月1日00:00:00 UTCからの経過秒数(Unixエポックタイム)です。 11 * getCTime() は、ファイルの作成日時やコンテンツ更新日時ではなく、 12 * iノード(ファイルシステム上のファイルの情報を管理するデータ構造)が 13 * 変更された時刻を返します。例えば、ファイルのパーミッション変更や 14 * ファイル名の変更などが該当します。 15 */ 16function demonstrateGlobIteratorGetCTime(): void 17{ 18 // カレントディレクトリ(このスクリプトがあるディレクトリ)内の 19 // すべてのPHPファイルを検索対象とします。 20 // 必要であれば、他のファイルパターン(例: __DIR__ . '/*.txt')に変更してください。 21 $pattern = __DIR__ . '/*.php'; 22 $iterator = new GlobIterator($pattern); 23 24 // イテレータが有効なエントリを一つも持たない場合(ファイルが見つからない場合) 25 if (!$iterator->valid()) { 26 echo "指定されたパターン ('" . $pattern . "') に一致するファイルが見つかりませんでした。\n"; 27 echo "このディレクトリにPHPファイルが存在するか確認してください。\n"; 28 return; 29 } 30 31 echo "GlobIterator::getCTime() を使ってファイルのiノード変更時刻を取得します:\n"; 32 echo "-------------------------------------------------------------------\n"; 33 34 // イテレータをループし、各ファイル情報を処理します 35 foreach ($iterator as $fileInfo) { 36 $filePath = $fileInfo->getPathname(); // ファイルのフルパスを取得 37 38 // getCTime() メソッドを呼び出し、iノード変更タイムスタンプを取得します 39 $cTime = $fileInfo->getCTime(); 40 41 echo "ファイル名: " . $filePath . "\n"; 42 43 // タイムスタンプが正常に取得できたかチェックします (int または false を返すため) 44 if ($cTime !== false) { 45 echo " iノード変更タイムスタンプ (Unixエポック): " . $cTime . "\n"; 46 // date() 関数を使って、人間が読める形式に変換して表示します 47 echo " 人間が読める形式の日時: " . date('Y-m-d H:i:s', $cTime) . "\n"; 48 } else { 49 echo " iノード変更時刻の取得に失敗しました。\n"; 50 } 51 echo "-------------------------------------------------------------------\n"; 52 } 53} 54 55// 関数を実行して、GlobIterator::getCTime() の動作を確認します。 56demonstrateGlobIteratorGetCTime(); 57
GlobIterator::getCTime()メソッドは、PHP 8で提供されるGlobIteratorクラスに属し、指定されたファイルやディレクトリの「iノード変更時刻」をUnixエポックタイムスタンプとして取得します。iノード変更時刻とは、ファイルのコンテンツ更新時刻や作成時刻とは異なり、ファイルシステム上のファイル情報(メタデータ)が最後に変更された日時を指します。具体的には、ファイルのパーミッション変更やファイル名の変更などがこれに該当します。タイムスタンプは、1970年1月1日00:00:00 UTCからの経過秒数を整数値で表したもので、php gettimestamp のように検索されることもあります。
このメソッドは引数を一切取らず、正常に時刻を取得できた場合はタイムスタンプを整数値(int)で返します。しかし、何らかの理由で時刻の取得に失敗した場合はfalseを返しますので、戻り値がfalseでないか確認するエラーハンドリングが重要です。
サンプルコードでは、まずGlobIteratorを使い、カレントディレクトリ内のPHPファイルを検索対象としてイテレータを作成しています。次に、foreachループで各ファイル情報にアクセスし、$fileInfo->getCTime()を呼び出すことで、それぞれのファイルのiノード変更タイムスタンプを取得しています。取得したタイムスタンプは、date()関数と組み合わせることで、「年-月-日 時:分:秒」のような人間が読みやすい形式に変換して表示しています。これにより、ファイルメタデータの変更履歴を確認することが可能です。
GlobIterator::getCTime()は、ファイルのコンテンツ更新日時や作成日時ではなく、iノードの変更日時(パーミッション変更やファイル名変更など)を返します。この違いを理解することが重要です。メソッドは成功時にUnixエポック形式のタイムスタンプ(整数)、失敗時にfalseを返すため、必ずfalseでないかを確認し、適切にエラー処理を行ってください。取得したタイムスタンプはdate()関数で人間が読める形式に変換できます。また、GlobIteratorで指定したファイルパターンに一致するファイルが存在しない場合も考慮し、適切に処理を分岐させてください。
PHP GlobIterator::getCTime でファイルの inode 変更時刻を取得する
1<?php 2 3/** 4 * GlobIterator::getCTime の使用例 5 * 6 * このスクリプトは、現在のディレクトリ内の特定のファイルパターンにマッチするファイルを見つけ、 7 * それぞれのファイルのinode変更時刻 (ctime) を取得して表示します。 8 * 初心者にも分かりやすいように、一時的なダミーファイルを作成し、処理後に削除します。 9 */ 10 11// このスクリプトが動作するために一時的なダミーファイルを作成します。 12// これらはGlobIteratorが処理する対象となります。 13$tempFileName1 = 'example_file_a.txt'; 14$tempFileName2 = 'example_file_b.txt'; 15 16try { 17 // ダミーファイルが存在しない場合は作成します。 18 // file_put_contents はファイルに内容を書き込み、ファイルが存在しない場合は作成します。 19 if (!file_exists($tempFileName1)) { 20 file_put_contents($tempFileName1, 'Content for example file A.'); 21 } 22 // PHP 8 の `touch` 関数はファイルアクセス時刻と更新時刻を更新します。 23 // ctime はinode変更時刻であり、ファイルの内容変更、パーミッション変更などで更新されます。 24 // 確実な ctime の変更を確認するために、ここではファイル作成と内容書き込みを行います。 25 if (!file_exists($tempFileName2)) { 26 file_put_contents($tempFileName2, 'Content for example file B.'); 27 } 28 29 echo "=== GlobIterator::getCTime の使用例 ===\n\n"; 30 echo "現在のディレクトリ内の 'example_file_*.txt' パターンにマッチするファイルの情報を表示します。\n\n"; 31 32 // GlobIterator をインスタンス化し、指定されたパターンにマッチするファイルを走査します。 33 // 'example_file_*.txt' は 'example_file_a.txt' や 'example_file_b.txt' にマッチします。 34 $globIterator = new GlobIterator('example_file_*.txt'); 35 36 // マッチするファイルがあるか確認します。 37 // GlobIterator は Countable インターフェースを実装しているため、count() メソッドで要素数を取得できます。 38 if ($globIterator->count() === 0) { 39 echo "指定されたパターンにマッチするファイルが見つかりませんでした。\n"; 40 } else { 41 // foreach ループを使用して、マッチした各ファイル情報を処理します。 42 // $fileInfo は SplFileInfo オブジェクトです。 43 foreach ($globIterator as $fileInfo) { 44 // 現在のファイルのフルパス名を取得します。 45 $filePath = $fileInfo->getPathname(); 46 47 // GlobIterator の現在の要素 ($fileInfo) から、 48 // inode 変更時刻 (ctime) を取得します。 49 // 戻り値は Unix タイムスタンプ (int) または、エラー時に false です。 50 $ctime = $fileInfo->getCTime(); 51 52 if ($ctime !== false) { 53 // 取得した Unix タイムスタンプを人間が読みやすい日付形式に変換します。 54 // 'Y-m-d H:i:s' は「年-月-日 時:分:秒」の形式です。 55 $formattedCtime = date('Y-m-d H:i:s', $ctime); 56 echo "ファイルパス: " . $filePath . "\n"; 57 echo " -> inode変更時刻 (ctime): " . $formattedCtime . " (Unixタイムスタンプ: " . $ctime . ")\n\n"; 58 } else { 59 echo "ファイルパス: " . $filePath . "\n"; 60 echo " -> inode変更時刻の取得に失敗しました。\n\n"; 61 } 62 } 63 } 64 65} catch (RuntimeException $e) { 66 // GlobIterator の初期化や内部処理でエラーが発生した場合にキャッチします。 67 echo "エラーが発生しました: " . $e->getMessage() . "\n"; 68} finally { 69 // 後処理: スクリプトの実行後、作成した一時ファイルを削除します。 70 // file_exists でファイルが存在するか確認してから unlink で削除します。 71 if (file_exists($tempFileName1)) { 72 unlink($tempFileName1); 73 } 74 if (file_exists($tempFileName2)) { 75 unlink($tempFileName2); 76 } 77 echo "\n=== 一時ファイルを削除しました ===\n"; 78}
GlobIterator::getCTimeメソッドは、PHPでファイルやディレクトリの情報をまとめて扱う際に使用するGlobIteratorクラスに属し、指定したファイルのinode変更時刻(ctime)を取得するものです。ctimeとは、ファイルの内容が変更された時刻(mtime)とは異なり、パーミッション、所有者、グループ、ファイル名など、ファイルの属性情報が最後に変更された時刻を指します。
このメソッドは引数をとりません。成功した場合は、ファイルのinode変更時刻を1970年1月1日 00:00:00 UTCからの秒数で表されるUnixタイムスタンプ(整数型int)として返します。時刻の取得に失敗した場合はfalseを返します。
サンプルコードでは、まず一時的なダミーファイルを作成し、GlobIteratorがこれらのファイルを処理できるように準備します。次に、GlobIteratorを使って特定のファイルパターン(例: example_file_*.txt)にマッチするファイルを検索し、それぞれのファイル情報にアクセスします。ループ内で各ファイルのSplFileInfoオブジェクトからgetCTimeメソッドを呼び出し、inode変更時刻を取得します。取得したUnixタイムスタンプは、date関数を使って人間が読みやすい日付形式に変換して表示しています。処理の終了後には、作成した一時ファイルを確実に削除するよう配慮されています。
GlobIterator::getCTime()はファイルのinode変更時刻をUnixタイムスタンプで返します。エラー時にはfalseが返されるため、必ず厳密な比較!== falseで戻り値を確認してください。取得されるctimeはファイル内容の最終更新時刻(mtime)とは異なり、パーミッション変更などファイル自身の情報が変更された場合にも更新される「inode変更時刻」である点に注意が必要です。返されるタイムスタンプはdate()関数などを用いて可読な形式に変換して利用します。また、ファイルシステムを操作するコードでは、サンプルコードのようにtry-catch-finallyを使用して例外処理を適切に行い、一時ファイルの削除など後処理を確実に行うことで、スクリプトの安定性と安全性を高めることができます。