【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 と 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関数の書式指定文字列を調整することで、様々な形式で時刻を表示できます。