【PHP8.x】filemtime関数の使い方
filemtime関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
filemtime関数は、指定されたファイルの最終更新時刻を取得する関数です。この関数は、ファイルの内容が最後に変更された日時を調べたい場合に使用されます。
引数として、時刻を知りたいファイルのパスを文字列で渡します。正常に時刻が取得できた場合、戻り値は整数型のUnixタイムスタンプとなります。Unixタイムスタンプとは、1970年1月1日0時0分0秒(UTC)から現在までの経過秒数を表す数値のことです。このタイムスタンプはそのままでは人が読める形式ではありませんが、PHPのdate関数など、他の関数と組み合わせることで、人間が読める日付と時刻の形式に変換して表示することができます。
ファイルが見つからない場合や、ファイルへの読み取り権限がない場合など、何らかの理由で時刻の取得に失敗した場合は、falseが返されます。そのため、関数の戻り値がfalseでないことを確認してから、タイムスタンプを利用することが重要です。
この関数は、ウェブサイトでファイルキャッシュの有効期限を管理したり、特定のファイルがいつ更新されたかを確認したりするなど、様々な状況で役立ちます。例えば、ファイルの更新日時をチェックして、そのファイルが新しい場合にのみ処理を実行するといった使い方が可能です。
構文(syntax)
1<?php 2$filepath = 'path/to/your/file.txt'; 3$timestamp = filemtime($filepath); 4?>
引数(parameters)
string $filename
- string $filename: タイムスタンプを取得したいファイルの名前(パスを含む)を指定する文字列
戻り値(return)
int|false
指定されたファイルの最終更新日時をUNIXタイムスタンプ(秒単位)で返します。ファイルの更新日時を取得できなかった場合はfalseを返します。
サンプルコード
PHP filemtime でタイムゾーン対応した日時表示
1<?php 2 3declare(strict_types=1); 4 5/** 6 * ファイルの最終更新日時を、指定されたタイムゾーンで表示します。 7 * 8 * filemtime() は、サーバーの設定に関わらず、常にUTC(協定世界時)に基づいた 9 * UNIXタイムスタンプを返します。そのため、特定の地域の時刻として表示するには、 10 * タイムゾーンの変換が必要です。 11 * 12 * @return void 13 */ 14function showFileModificationTimeWithTimezone(): void 15{ 16 // サンプル用のファイルを作成します。 17 $filename = 'testfile.tmp'; 18 // try...finally構文を使い、処理の成否に関わらずファイルを確実に削除します。 19 try { 20 if (!file_put_contents($filename, 'Hello, PHP!')) { 21 echo "テストファイルの作成に失敗しました。\n"; 22 return; 23 } 24 25 // filemtime()でファイルの最終更新日時をUNIXタイムスタンプとして取得します。 26 // 失敗した場合は false が返ります。 27 $modificationTimestamp = filemtime($filename); 28 29 if ($modificationTimestamp === false) { 30 echo "ファイルの最終更新日時の取得に失敗しました。\n"; 31 return; 32 } 33 34 echo "ファイル名: {$filename}\n"; 35 echo "最終更新日時 (UNIXタイムスタンプ): {$modificationTimestamp}\n\n"; 36 37 // --- タイムゾーンを考慮した日時に変換して表示 --- 38 39 // タイムスタンプからDateTimeImmutableオブジェクトを生成します。 40 // '@'プレフィックスは、続く数値がUNIXタイムスタンプであることを示します。 41 // このオブジェクトのタイムゾーンは、デフォルトでUTCになります。 42 $datetimeUtc = new DateTimeImmutable('@' . $modificationTimestamp); 43 44 // 表示したいタイムゾーン(例: 日本標準時)を指定します。 45 $timezoneTokyo = new DateTimeZone('Asia/Tokyo'); 46 47 // UTCの日時を、指定したタイムゾーンの日時に変換します。 48 $datetimeTokyo = $datetimeUtc->setTimezone($timezoneTokyo); 49 50 // 人間が読みやすい形式で日時を表示します。 51 echo "タイムゾーン (UTC): " . $datetimeUtc->format('Y-m-d H:i:s T') . "\n"; 52 echo "タイムゾーン (Asia/Tokyo): " . $datetimeTokyo->format('Y-m-d H:i:s T') . "\n"; 53 } catch (Exception $e) { 54 // DateTimeZoneなどで例外が発生した場合の処理です。 55 echo "エラーが発生しました: " . $e->getMessage() . "\n"; 56 } finally { 57 // スクリプトの最後にテストファイルを削除します。 58 if (file_exists($filename)) { 59 unlink($filename); 60 } 61 } 62} 63 64// 関数を実行します。 65showFileModificationTimeWithTimezone();
filemtime()関数は、引数で指定されたファイルの最終更新日時を取得します。引数$filenameには、調べたいファイルへのパスを文字列で渡します。
この関数は、成功するとファイルの最終更新日時をUNIXタイムスタンプで返します。UNIXタイムスタンプとは、世界共通の基準時刻であるUTC(協定世界時)の1970年1月1日午前0時からの経過秒数を表す整数値です。ファイルの情報を取得できないなど、処理に失敗した場合はfalseを返します。
サンプルコードでは、まずfilemtime()で取得したUNIXタイムスタンプをそのまま表示しています。しかし、この数値だけでは具体的な日時が分かりにくいため、特定のタイムゾーンに合わせた日時に変換する必要があります。コードではDateTimeImmutableクラスを使ってタイムスタンプから日時オブジェクトを生成し、次にsetTimezone()メソッドでタイムゾーンを「Asia/Tokyo」(日本標準時)に変換しています。これにより、サーバーがどの地域の時刻で設定されていても、意図した地域の正確な日時として表示することができます。最後にformat()メソッドを使い、人間が読みやすい形式の文字列として出力しています。
filemtime()関数が返すUNIXタイムスタンプは、サーバーの設定に関わらず常にUTC(協定世界時)が基準です。そのため、日本時間など特定の地域の時刻として表示するには、サンプルコードのようにDateTimeZoneオブジェクトを使って明示的にタイムゾーンを変換する必要があります。この変換を怠ると、意図しない時刻が表示される原因となります。また、この関数はファイルが存在しないなどの理由で失敗した場合にfalseを返すため、戻り値のチェックは === 演算子で厳密に行うことが推奨されます。さらに、PHPはファイルの状態をキャッシュするため、短時間で何度も同じファイルの情報を取得する際は、clearstatcache()関数でキャッシュをクリアしないと古い情報が返される場合がある点にも注意が必要です。
PHP filemtime でファイル更新日時を取得し、取得できない場合に対処する
1<?php 2 3/** 4 * ファイルの最終更新タイムスタンプを取得し、 5 * 'filemtime' が取得できない場合の対処法を示す関数。 6 * 7 * filemtime() 関数は、指定されたファイルの最終更新時刻のUnixタイムスタンプを返します。 8 * ファイルが存在しない場合や、読み取り権限がない場合は false を返します。 9 * このサンプルでは、主にファイルが存在しないケースと、その際の適切なエラーハンドリングを示します。 10 */ 11function getFileModificationTimeSafely(): void 12{ 13 // 既存のファイルをシミュレートするためのファイル名 14 $existingFilename = 'temp_existing_file.txt'; 15 // 存在しないファイルをシミュレートするためのファイル名 16 $nonExistingFilename = 'temp_non_existent_file.txt'; 17 18 // --- 1. 存在するファイルの場合の処理 --- 19 // テスト用のファイルを作成 20 file_put_contents($existingFilename, "This is a temporary file for testing filemtime."); 21 echo "--- 存在するファイル ({$existingFilename}) の処理 ---\n"; 22 23 // 事前にファイルが存在するかどうかを確認することが重要です。 24 // これにより、filemtime() が false を返す原因が「ファイルが存在しない」ことなのか、 25 // それとも「アクセス権がない」ことなのかを切り分けやすくなります。 26 if (file_exists($existingFilename)) { 27 $timestamp = filemtime($existingFilename); 28 29 if ($timestamp !== false) { 30 // タイムスタンプが正常に取得できた場合 31 echo "ファイル '{$existingFilename}' の最終更新タイムスタンプ (Unix): " . $timestamp . "\n"; 32 // 人間が読める形式に変換 33 $dateTime = new DateTimeImmutable("@$timestamp"); 34 echo "最終更新日時: " . $dateTime->format('Y-m-d H:i:s') . "\n"; 35 } else { 36 // ファイルは存在するが、タイムスタンプが取得できなかった場合 37 // (例: アクセス権限がない、ファイルが破損しているなど) 38 echo "エラー: ファイル '{$existingFilename}' の最終更新タイムスタンプを取得できませんでした。\n"; 39 echo "ファイルは存在しますが、PHPにファイルへの読み取り権限があるか確認してください。\n"; 40 } 41 } else { 42 // このパスは通常、このサンプルでは実行されません(ファイルを作成しているため) 43 echo "エラー: ファイル '{$existingFilename}' が見つかりませんでした。これは予期せぬ状況です。\n"; 44 } 45 46 echo "\n--- 存在しないファイル ({$nonExistingFilename}) の処理 ---\n"; 47 48 // --- 2. 存在しないファイルの場合の処理 --- 49 if (file_exists($nonExistingFilename)) { 50 // このブロックは実行されません 51 echo "エラー: 存在しないはずのファイル '{$nonExistingFilename}' が見つかりました。\n"; 52 } else { 53 // ファイルが存在しないことを確認できた場合 54 echo "ファイル '{$nonExistingFilename}' は存在しません。\n"; 55 echo "filemtime() を直接呼び出すと、false が返されます。\n"; 56 57 $timestamp = filemtime($nonExistingFilename); 58 59 if ($timestamp === false) { 60 echo "filemtime() は期待通り false を返しました。\n"; 61 } else { 62 // このパスは通常、実行されません 63 echo "予期せぬ結果: filemtime() が false 以外を返しました。\n"; 64 } 65 } 66 67 // --- クリーンアップ --- 68 // テスト用に作成したファイルを削除します 69 if (file_exists($existingFilename)) { 70 unlink($existingFilename); 71 echo "\nテストファイル '{$existingFilename}' を削除しました。\n"; 72 } 73} 74 75// 関数を実行 76getFileModificationTimeSafely();
filemtime関数は、指定されたファイルの最終更新時刻をUnixタイムスタンプ形式(1970年1月1日からの経過秒数)で取得します。引数には、最終更新時刻を調べたいファイルへのパスを文字列で指定します。
処理が成功すると、ファイルの最終更新時刻を示す整数型のタイムスタンプが返されます。一方、指定されたファイルが存在しない、またはPHPスクリプトにそのファイルを読み取る権限がないなどの理由で時刻を取得できない場合は false を返します。
このサンプルコードは、特にfilemtimeがfalseを返す場合の適切な対処法を示しています。filemtimeを呼び出す前にfile_exists関数を使ってファイルの存在を事前に確認することが重要です。これにより、falseが返ってきた原因が「ファイルが存在しない」ためなのか、「アクセス権限がない」といった他の問題なのかを明確に区別できます。コードでは、実際にファイルを作成してタイムスタンプを正常に取得する例と、存在しないファイルを指定してfalseが返されることを確認する例を通して、安全なファイルの最終更新時刻の取得方法を解説しています。
filemtime関数を利用する前にfile_exists関数でファイルの存在を確認することが重要です。これにより、filemtime関数が失敗してfalseを返した場合に、ファイルが存在しないことが原因なのか、アクセス権限がないといった別の問題なのかを切り分けやすくなります。関数の戻り値を確認する際は、=== falseのように厳密な比較演算子を使用してください。ファイルの更新日時によってはタイムスタンプが0になることがあり、==で比較するとfalseと誤って判定される可能性があるためです。また、ファイルが存在していても、PHPの実行ユーザーにそのファイルを読み取る権限がなければ失敗する点にも注意しましょう。