【PHP8.x】filectime()関数の使い方
filectime関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『filectime関数は、指定されたファイルのinode変更時刻を取得する関数です』
ctimeはしばしば「creation time(作成時刻)」と誤解されがちですが、正しくは「change time(変更時刻)」を指します。inodeとは、ファイルやディレクトリの所有者、パーミッション、サイズ、最終アクセス時刻といったメタデータを管理するための情報です。filectime関数が返すのは、このinode情報が最後に変更された時刻のことであり、ファイルの内容が変更された場合だけでなく、パーミッションや所有者が変更された際にも更新されます。この関数は、引数に調査したいファイルのパスを文字列で指定します。成功した場合は、そのファイルのinode変更時刻をUNIXタイムスタンプ形式の整数値で返します。UNIXタイムスタンプとは、1970年1月1日からの経過秒数を表す数値です。ファイルの取得に失敗した場合は false を返します。ただし、動作はオペレーティングシステムによって異なり、多くのUNIX系システムではinode変更時刻を返しますが、Windows環境ではファイルの作成時刻を返します。また、PHPはファイルのステータス情報をキャッシュするため、ループ内で同一ファイルの情報を繰り返し取得する際は、clearstatcache()関数でキャッシュをクリアしないと古い情報が返され続ける可能性がある点に注意が必要です。
構文(syntax)
1filectime(string $filename): int|false
引数(parameters)
string $filename
- string $filename: タイムスタンプを取得するファイルのパスを指定する文字列
戻り値(return)
int|false
指定されたファイルパスのファイルの最終変更時刻(Unixタイムスタンプ)を整数で返します。ファイルが存在しない、またはアクセス権がない場合は false を返します。
サンプルコード
PHP filectime 関数でファイル変更時刻を取得する
1<?php 2 3/** 4 * 指定されたファイルの inode 変更時刻を取得し、表示する関数。 5 * 6 * PHP 8 の filectime 関数を使用して、ファイルの inode 変更時刻(Unixタイムスタンプ)を取得します。 7 * 取得に成功した場合、タイムスタンプとその人間が読める形式を表示します。 8 * 失敗した場合はエラーメッセージを表示します。 9 * 10 * @param string $filename 処理するファイルパス。 11 * @return void 12 */ 13function displayFileCtime(string $filename): void 14{ 15 // ファイルが存在するか確認 16 if (!file_exists($filename)) { 17 echo "エラー: ファイル '{$filename}' が見つかりません。\n"; 18 return; 19 } 20 21 // filectime 関数を使ってファイルの inode 変更時刻を取得 22 // 戻り値はUnixタイムスタンプ (int) または、失敗した場合は false 23 $inodeChangeTime = filectime($filename); 24 25 if ($inodeChangeTime !== false) { 26 echo "ファイル '{$filename}' の inode 変更時刻 (Unixタイムスタンプ): {$inodeChangeTime}\n"; 27 // 取得したタイムスタンプを読みやすい日付形式に変換 28 echo "人間が読める形式: " . date('Y-m-d H:i:s', $inodeChangeTime) . "\n"; 29 } else { 30 echo "ファイル '{$filename}' の inode 変更時刻の取得に失敗しました。\n"; 31 } 32} 33 34// --- サンプルコードの実行 --- 35 36// 1. 正常なケース: 存在するファイルの inode 変更時刻を取得 37$testFilename = 'example_file_for_ctime.txt'; 38 39// テスト用のファイルを作成 (filectime が動作するためにはファイルが必要です) 40if (!file_put_contents($testFilename, 'これはfilectime関数のテストファイルです。')) { 41 echo "エラー: テストファイル '{$testFilename}' の作成に失敗しました。\n"; 42 exit(1); // スクリプトを異常終了 43} 44echo "テストファイル '{$testFilename}' を作成しました。\n\n"; 45 46// 作成したファイルの inode 変更時刻を表示 47displayFileCtime($testFilename); 48 49echo "\n"; // 出力を見やすくするための区切り 50 51// 後処理: テストファイルを削除 52if (file_exists($testFilename)) { 53 unlink($testFilename); 54 echo "テストファイル '{$testFilename}' を削除しました。\n"; 55} 56 57echo "\n"; // 出力を見やすくするための区切り 58 59// 2. エラーケース: 存在しないファイルの inode 変更時刻を取得しようとする 60$nonExistentFilename = 'non_existent_file.txt'; 61echo "存在しないファイル '{$nonExistentFilename}' での試行:\n"; 62displayFileCtime($nonExistentFilename); 63 64?>
PHPのfilectime関数は、指定したファイルのinode変更時刻を取得します。inode変更時刻とは、ファイルの内容更新に加え、アクセス権限や所有者といったメタデータが最後に変更された時刻を指します。引数には、時刻を知りたいファイルのパスを文字列で渡してください。関数が成功すると、1970年1月1日 00:00:00 UTCからの秒数を示すUnixタイムスタンプ(整数値)が返されます。もしファイルの存在確認で失敗したり、アクセス権限の問題などで時刻の取得に失敗した場合は、falseが戻り値となります。
サンプルコードでは、まずfile_exists関数で対象ファイルがあるかを確認し、その後filectime関数でinode変更時刻を取得しています。取得したUnixタイムスタンプは、直接見ても分かりにくいため、date関数を使用することで「YYYY-MM-DD HH:MM:SS」のような、人間が読みやすい日付と時刻の形式に変換して表示しています。また、ファイルが存在しない場合のエラー処理も含まれており、堅牢なコードの書き方を学ぶ上でも参考になります。
filectime関数は、ファイルのパーミッション変更や移動、リネームなど、ファイルの中身以外の情報(inode)が変更された時刻をUnixタイムスタンプで返します。ファイル内容の変更時刻を知りたい場合はfilemtime関数を使用してください。関数が失敗するとfalseが返されるため、戻り値をif ($inodeChangeTime !== false)のように必ずチェックする習慣をつけましょう。また、対象のファイルが存在しない場合もエラーとなるため、file_exists()関数で事前にファイルパスの有効性を確認すると、より安全にコードを記述できます。取得したタイムスタンプは数値なので、date()関数などを使って人間が読める形式に変換することが一般的です。
PHP: filectime と filemtime の違いを理解する
1<?php 2 3/** 4 * filectime と filemtime の違いを示すサンプルコード. 5 * 6 * filectime: ファイルの最終状態変更時刻 (inode の変更). 7 * filemtime: ファイルの内容の最終更新時刻. 8 */ 9 10$filename = 'example.txt'; 11 12// ファイルが存在しない場合は作成 13if (!file_exists($filename)) { 14 touch($filename); 15} 16 17// 現在時刻を取得 18$now = time(); 19 20// ファイルの最終状態変更時刻 (filectime) を取得 21$ctime = filectime($filename); 22 23// ファイルの内容の最終更新時刻 (filemtime) を取得 24$mtime = filemtime($filename); 25 26echo "ファイル名: " . $filename . PHP_EOL; 27echo "現在のタイムスタンプ: " . $now . PHP_EOL; 28echo "最終状態変更時刻 (ctime): " . $ctime . PHP_EOL; 29echo "最終更新時刻 (mtime): " . $mtime . PHP_EOL; 30 31// ファイルを更新する (mtime を変更) 32touch($filename); 33 34// 更新後の時刻を取得 35$new_mtime = filemtime($filename); 36 37echo "ファイルを更新しました." . PHP_EOL; 38echo "新しい最終更新時刻 (mtime): " . $new_mtime . PHP_EOL; 39echo "最終状態変更時刻 (ctime) はtouch()によって更新される可能性がある: " . filectime($filename) . PHP_EOL; 40 41// ファイルの属性を変更する (ctime を変更) 42chmod($filename, 0777); 43 44// 更新後の時刻を取得 45$new_ctime = filectime($filename); 46 47echo "ファイルの属性を変更しました." . PHP_EOL; 48echo "新しい最終状態変更時刻 (ctime): " . $new_ctime . PHP_EOL; 49echo "最終更新時刻 (mtime)は変更されていない: " . filemtime($filename) . PHP_EOL; 50
このサンプルコードは、PHPの filectime 関数と filemtime 関数の違いを理解するためのものです。filectime 関数は、指定されたファイルの最終状態変更時刻(inodeの変更時刻)をUnixタイムスタンプとして返します。一方、filemtime 関数は、ファイルの内容が最後に更新された時刻をUnixタイムスタンプとして返します。
コードではまず、example.txt というファイルが存在しない場合に作成します。次に、filectime 関数と filemtime 関数を使って、それぞれの時刻を取得し表示します。
touch 関数を使ってファイルの内容を更新すると、filemtime の値が更新されます。また、touch 関数は filectime の値も更新する可能性があります。
次に、chmod 関数を使ってファイルの属性を変更すると、filectime の値が更新されますが、filemtime の値は変更されません。
このように、filectime はファイルの属性(パーミッションなど)が変更された場合にも更新されるのに対し、filemtime はファイルの内容が変更された場合にのみ更新される点が異なります。システム開発においては、これらの違いを理解し、目的に応じて適切な関数を使用することが重要です。filectime 関数は、ファイルが存在しない場合やエラーが発生した場合は false を返します。
filectime()とfilemtime()は、どちらもファイルに関する時刻情報を取得する関数です。filectime()はファイルの最終状態変更時刻を、filemtime()はファイルの内容の最終更新時刻を返します。filectime()は、ファイルの内容だけでなく、パーミッションの変更など、ファイルの属性が変更された場合にも更新されます。touch()関数は、ファイルの最終更新時刻(mtime)と最終状態変更時刻(ctime)を現在時刻に更新します。chmod()関数はファイルアクセス権を変更し、filectime()の値を更新しますが、filemtime()の値は変更しません。ファイルのタイムスタンプを扱う際には、これらの違いを理解しておくことが重要です。戻り値がfalseになる場合(ファイルが存在しないなど)もあるため、エラーハンドリングも考慮しましょう。
PHPでファイル作成時刻を取得する
1<?php 2 3/** 4 * ファイルの作成時刻を取得するサンプルコード 5 */ 6$filename = 'example.txt'; 7 8// ファイルが存在しない場合は作成する 9if (!file_exists($filename)) { 10 touch($filename); 11} 12 13// ファイルの作成時刻を取得する 14$creationTime = filectime($filename); 15 16// 取得に成功した場合 17if ($creationTime !== false) { 18 echo "ファイルの作成時刻: " . date("Y-m-d H:i:s", $creationTime) . PHP_EOL; 19} else { 20 echo "ファイルの作成時刻の取得に失敗しました。" . PHP_EOL; 21} 22 23// ファイルの最終更新時刻を取得する 24$modificationTime = filemtime($filename); 25 26// 取得に成功した場合 27if ($modificationTime !== false) { 28 echo "ファイルの最終更新時刻: " . date("Y-m-d H:i:s", $modificationTime) . PHP_EOL; 29} else { 30 echo "ファイルの最終更新時刻の取得に失敗しました。" . PHP_EOL; 31}
このPHPサンプルコードは、filectime関数を使用してファイルの作成時刻を取得する方法を示しています。filectime関数は、引数に指定されたファイル $filename の作成時刻をUnixタイムスタンプ(整数値)として返します。ファイルが存在しない場合や、アクセスできない場合は false を返します。
まず、example.txtという名前のファイルが存在するか確認し、存在しない場合は touch 関数で新規作成します。次に、filectime関数にファイル名を渡し、ファイルの作成時刻を取得します。
取得した作成時刻が false でない場合、date関数を使用してUnixタイムスタンプを人間が読みやすい日付と時刻の形式に変換し、画面に出力します。もし false が返された場合は、作成時刻の取得に失敗した旨を表示します。
また、参考としてfilemtime関数を用いてファイルの最終更新時刻を取得する例も記載しています。filemtime関数は、ファイルの最終更新時刻をUnixタイムスタンプで返します。filectimeとfilemtimeの違いを理解することで、ファイルに関する情報をより深く扱えるようになります。ファイル操作を行う上で、これらの関数は非常に役立ちますので、ぜひ活用してください。
filectime関数は、ファイルの「inode変更時刻」を返します。これは、ファイルのアクセス権や所有者などのメタデータが変更された時刻であり、ファイルの作成時刻とは異なる場合があります。多くのシステムでは、ファイルの作成時刻は直接取得できません。ファイルの作成時刻を厳密に知りたい場合は、別の方法(ログ記録など)を検討する必要があります。
filectimeとfilemtimeは、ファイルが存在しない場合にfalseを返します。サンプルコードのように、事前にfile_existsでファイルの存在を確認し、必要に応じてtouch関数でファイルを作成しておくことで、エラーを回避できます。
取得した時刻はUnixタイムスタンプ(秒単位の整数)なので、date関数を使って人間が読みやすい形式に変換しています。date関数の書式指定文字列を調整することで、様々な形式で時刻を表示できます。