【PHP8.x】RecursiveDirectoryIterator::getMTime()メソッドの使い方
getMTimeメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
getMTimeメソッドは、PHPのRecursiveDirectoryIteratorクラスに属し、現在のイテレータが指し示すファイルまたはディレクトリの最終更新時刻を取得するために実行されるメソッドです。
このメソッドは、対象のファイルやディレクトリが最後に変更された日時、つまり「最終更新時刻(Modification Time)」の情報を取得します。取得される時刻は、1970年1月1日00:00:00 UTC(協定世界時)からの経過秒数として表されるUNIXタイムスタンプ形式の整数値です。ファイルの内容が上書きされたり、ディレクトリ内のファイルやサブディレクトリが追加・削除されたりした場合に、この最終更新時刻は更新されます。
getMTimeメソッドの利用は、システム内でファイルの更新状況を監視したり、特定の条件に基づいてファイルを処理したりする際に非常に重要です。例えば、ウェブサイトのキャッシュを無効にするタイミングの決定、バックアップシステムにおける変更されたファイルの識別、あるいは異なるシステムのファイル同期といった場面で、この最終更新時刻の情報が活用されます。
取得したUNIXタイムスタンプは、PHPのdate()関数などの時間関連関数と組み合わせることで、人間が理解しやすい年-月-日 時:分:秒といった形式に変換することが可能です。これにより、プログラムの実行結果やログの可読性が向上し、ファイルの状態をより詳細に把握できるようになります。
構文(syntax)
1<?php 2 3// RecursiveDirectoryIterator のインスタンスを作成します。 4// ここでは、現在のスクリプトがあるディレクトリ (__DIR__) を例として使用します。 5$directoryIterator = new RecursiveDirectoryIterator(__DIR__); 6 7// RecursiveIteratorIterator でラップすることで、サブディレクトリも再帰的に走査できるようになります。 8$recursiveIterator = new RecursiveIteratorIterator($directoryIterator); 9 10// ディレクトリ内の各ファイルやディレクトリをループ処理します。 11foreach ($recursiveIterator as $fileInfo) { 12 // 現在の要素がファイルであるかを確認します。 13 if ($fileInfo->isFile()) { 14 // getMTime() メソッドを呼び出して、ファイルの最終変更時刻 (Unixタイムスタンプ) を取得します。 15 $lastModifiedTime = $fileInfo->getMTime(); 16 17 // 取得したタイムスタンプを人間が読める形式に変換して出力します。 18 echo "ファイル: " . $fileInfo->getFilename() . " の最終変更時刻: " . date('Y-m-d H:i:s', $lastModifiedTime) . "\n"; 19 } 20} 21 22?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
RecursiveDirectoryIterator::getMTime()メソッドは、ファイルまたはディレクトリの最終更新時刻をUnixタイムスタンプ(秒単位の整数)で返します。
サンプルコード
PHP RecursiveDirectoryIterator::getMTime で最終更新日時を取得する
1<?php 2 3/** 4 * RecursiveDirectoryIterator::getMTime の使用例 5 * 指定されたディレクトリ内のファイルやサブディレクトリの最終更新日時を取得します。 6 * 7 * この関数は、テスト用のディレクトリとファイルを作成し、それらを走査して 8 * 各要素の最終更新日時を取得・表示し、最後にクリーンアップを行います。 9 */ 10function demonstrateRecursiveDirectoryIteratorGetMTime(): void 11{ 12 // テスト用のディレクトリとファイルのパスを定義します 13 $baseDir = __DIR__ . '/recursive_mtime_test'; 14 $subDir = $baseDir . '/subdir'; 15 $file1 = $baseDir . '/file1.txt'; 16 $file2 = $subDir . '/file2.txt'; 17 18 // 既存のテストディレクトリがあれば、安全に削除して再作成します 19 if (is_dir($baseDir)) { 20 // RecursiveIteratorIterator を使って、子要素から順に削除 21 $cleanUpIterator = new RecursiveIteratorIterator( 22 new RecursiveDirectoryIterator($baseDir, RecursiveDirectoryIterator::SKIP_DOTS), 23 RecursiveIteratorIterator::CHILD_FIRST 24 ); 25 foreach ($cleanUpIterator as $item) { 26 if ($item->isDir()) { 27 rmdir($item->getPathname()); 28 } else { 29 unlink($item->getPathname()); 30 } 31 } 32 rmdir($baseDir); 33 } 34 35 // テスト用のディレクトリとファイルを作成します 36 mkdir($baseDir); 37 mkdir($subDir); 38 file_put_contents($file1, 'これはファイル1の内容です。'); 39 sleep(1); // タイムスタンプに差をつけるため、少し待機 40 file_put_contents($file2, 'これはファイル2の内容です。'); 41 // ディレクトリ自身のタイムスタンプを設定 (例: 1時間前、2時間前) 42 touch($subDir, time() - 3600); 43 touch($baseDir, time() - 7200); 44 45 echo "--- ディレクトリとファイルの最終更新日時を取得します ---\n"; 46 47 try { 48 // RecursiveDirectoryIterator を使用して、指定されたディレクトリを再帰的に走査します。 49 // SKIP_DOTS: "." と ".." エントリをスキップします。 50 $directoryIterator = new RecursiveDirectoryIterator($baseDir, RecursiveDirectoryIterator::SKIP_DOTS); 51 52 // RecursiveIteratorIterator と組み合わせて、ディレクトリの再帰的な走査を可能にします。 53 // SELF_FIRST: ディレクトリ自体をその子要素より先に処理します。 54 $iterator = new RecursiveIteratorIterator($directoryIterator, RecursiveIteratorIterator::SELF_FIRST); 55 56 // イテレータをループして、各ファイル/ディレクトリの情報を取得します 57 foreach ($iterator as $fileInfo) { 58 // RecursiveDirectoryIterator から得られる $fileInfo オブジェクトは SplFileInfo を継承しており、 59 // そのメソッドである getMTime() を使用して最終更新日時(Unixタイムスタンプ)を取得できます。 60 $mtime = $fileInfo->getMTime(); 61 62 // Unixタイムスタンプを人間が読める日付形式に変換します 63 $formattedMtime = date('Y-m-d H:i:s', $mtime); 64 65 // ファイルまたはディレクトリのパスと更新日時を表示します 66 echo sprintf( 67 "%s [%s]: %s (Unixタイムスタンプ: %d)\n", 68 $fileInfo->getPathname(), 69 $fileInfo->isDir() ? 'DIR' : 'FILE', // 要素がディレクトリかファイルかを表示 70 $formattedMtime, 71 $mtime 72 ); 73 } 74 75 } catch (RuntimeException $e) { 76 // ディレクトリが存在しないなどのエラーが発生した場合の処理 77 echo "エラーが発生しました: " . $e->getMessage() . "\n"; 78 } finally { 79 // サンプル実行後、作成したファイルとディレクトリをクリーンアップします 80 echo "\n--- クリーンアップ中 ---\n"; 81 // CHILD_FIRST: 子要素から先に処理することで、ファイルから削除し、最後に空のディレクトリを削除できます。 82 $cleanUpIterator = new RecursiveIteratorIterator( 83 new RecursiveDirectoryIterator($baseDir, RecursiveDirectoryIterator::SKIP_DOTS), 84 RecursiveIteratorIterator::CHILD_FIRST 85 ); 86 87 foreach ($cleanUpIterator as $item) { 88 if ($item->isDir()) { 89 rmdir($item->getPathname()); 90 } else { 91 unlink($item->getPathname()); 92 } 93 echo "削除: " . $item->getPathname() . "\n"; 94 } 95 // ベースディレクトリ自体も削除します 96 rmdir($baseDir); 97 echo "クリーンアップが完了しました。\n"; 98 } 99} 100 101// 関数を実行して動作を確認します 102demonstrateRecursiveDirectoryIteratorGetMTime();
RecursiveDirectoryIterator::getMTimeは、PHPでファイルやディレクトリの最終更新日時を取得するためのメソッドです。このメソッドは、RecursiveDirectoryIteratorクラスのインスタンスが表すファイルやディレクトリについて、Unixタイムスタンプ形式の整数値で最終更新日時を返します。引数は不要です。
サンプルコードでは、まずテスト用のディレクトリとファイルをいくつか作成し、それぞれに異なる更新日時を設定しています。その後、RecursiveDirectoryIteratorとRecursiveIteratorIteratorを組み合わせて使用することで、指定されたベースディレクトリとその中のサブディレクトリ、さらにその中のファイルまで、すべての要素を再帰的に順に処理しています。
ループ内で各要素(ファイルまたはディレクトリ)が取得されるたびに、その要素を表すオブジェクトに対してgetMTime()メソッドを呼び出し、最終更新日時を表すUnixタイムスタンプを取得しています。取得したタイムスタンプは、date()関数を使って「YYYY-MM-DD HH:MM:SS」のような人間が読みやすい形式に変換され、ファイルの種類(ディレクトリかファイルか)とパス情報とともに表示されます。これにより、どの要素がいつ更新されたかを一覧で確認できます。最後に、作成したテスト用のディレクトリとファイルは安全に削除され、環境がクリーンアップされます。このコードは、システムのファイル構造を調べて最終更新情報を把握する際などに役立ちます。
getMTimeはファイルの最終更新日時をUnixタイムスタンプ(整数値)で返します。人間が読める形式にするには、date()関数などで変換する必要があります。このメソッドはRecursiveDirectoryIteratorが返すSplFileInfoオブジェクトから呼び出され、通常はRecursiveIteratorIteratorと組み合わせてディレクトリを再帰的に走査する際に利用されます。走査対象のディレクトリが存在しない場合やアクセス権がない場合、RuntimeExceptionが発生する可能性があるため、try-catchで適切にエラーハンドリングを行うことが重要です。また、サンプルコードのようにファイルやディレクトリを作成・削除する操作は、実行パスを誤るとシステムに影響を与える可能性があるので、実際の運用ではパス指定や権限設定に細心の注意を払ってください。