PHPのファイルのタイムスタンプにはmitime、ctime、atimの3つがあります。そのうちのctimeについては、OSによって内容が異なるので注意が必要です。
ここでは、PHPでのファイルのタイムスタンプについての留意点や取得するための関数の使い方を紹介します。
PHPプログラミングに興味のある方は、プログラミング学習の参考としてここでしっかり内容をおさえておきましょう。
目次
PHPのファイルタイムスタンプは3種類
PHPではファイルの属性としてタイムスタンプを取得することができます。取得できるタイムスタンプは以下の3つです。
タイム スタンプ |
概要 | 説明 |
---|---|---|
mtime | 最終更新時刻 | ファイルのデータを更新した場合に変化します |
atime | 最終アクセス時刻 | ファイルにアクセスした場合には変化します。 データを更新しなくても変化します。 |
ctime | 最終inode更新時刻 | パーミッションや所有者idなどを更新した場合に変化します。 また、データ更新した場合も変化します。 |
これらの値は、UNIXタイムスタンプで記録されています。
UNIXタイムスタンプとは、協定世界時(UTC)での1970年1月1日0時0分0秒からの経過時間を秒数で表したものです。
タイムスタンプを見てわかるように年月日で表示するには、フォーマットを指定する必要があります。
ファイルのタイムスタンプはOSによって扱いが異なる
各OSが採用しているファイルシステムによって、タイムスタンプの種類や内容に相違があります。
ファイル更新時刻などをOSのコマンドで参照している場合にはあまり意識しませんが、PHPプログラムで直接タイムスタンプを操作する場合は留意が必要です。
以下にLinuxとWindowsの場合を示します。
Linuxの場合
代表的な操作におけるタイムスタンプの更新状況は以下のとおりです。
タイムスタンプ | mtime | atime | ctime |
---|---|---|---|
定義 | 最終更新時刻 | 最終アクセス時刻 | inode最終更新時刻 |
新規作成(touch) | 更新 | 更新 | 更新 |
データ変更 (viで更新) |
更新 | 更新 | 更新 |
データ参照(cat) | ー | 更新 | ー |
権限変更(chmod) | ー | 更新 | 更新 |
この表からわかるように、Linuxではctimeはデータ内容やファイル管理情報の変更によって更新されます。
なお、EXT4などのファイルシステムを除き、Linuxではファイルの作成時刻は記録されません。
Windowsの場合
代表的な操作におけるタイムスタンプの更新状況は以下のとおりです。
タイムスタンプ | mtime | atime | ctime |
---|---|---|---|
定義 | 最終 更新時刻 |
最終 アクセス時刻 |
新規 作成時刻 |
新規作成 (エディタなど) |
更新 | 更新 | 更新 |
データ変更 (エディタなど) |
更新 | 更新 | ー |
権限変更(アクセス許可) | ー | 更新 | ー |
この表からわかるように、Windowsではctimeはファイルの作成時刻を保持するもので、内容変更や管理情報の変更があっても更新されません。
タイムスタンプの値を知るには
filectime
ファイルの inode 変更時刻を取得する
1 |
int filectime ( string $filename ) |
パラメータ | 型 | 説明 |
---|---|---|
$filename | string | ァイルへのパス。 |
- ・ファイルの最終更新時刻を示す Unix タイムスタンプ。
- ・失敗した場合に false を返します。
fileatime
ファイルの最終アクセス(access)時刻を取得する
1 |
int fileatime( string $filename ) |
パラメータ | 型 | 説明 |
$filename | string | ァイルへのパス。 |
- ・ファイルの最終アクセス時刻を示す Unix タイムスタンプ。
- ・失敗した場合に false を返します。
filemtime
ファイルの更新(modify)時刻を取得する
1 |
int filemtime( string $filename ) |
パラメータ | 型 | 説明 |
---|---|---|
$filename | string | ァイルへのパス。 |
- ・ファイルの最終更新時刻を示す Unix タイムスタンプ。
- ・失敗した場合に false を返します。
タイムスタンプの使用例
ここではOSによってctimeをはじめタイムスタンプの内容が異なることを使用例で示します。なお、Linuxはwsl2での実行結果です。
1 2 3 4 5 6 7 8 9 |
<?PHP // ファイルを新規作成したときのタイムスタンプ $filename = 'somefile.txt'; file_put_contents($filename,"data1"); echo "OS:".PHP_OS.PHP_EOL; echo "$filename 新規作成 ctime: " . date("F d Y H:i:s.", filectime($filename)).PHP_EOL; echo "$filename 新規作成 atime: " . date("F d Y H:i:s.", fileatime($filename)).PHP_EOL; echo "$filename 新規作成 mtime: " . date("F d Y H:i:s.", filemtime($filename)).PHP_EOL; ?> |
1 2 3 4 5 6 7 8 9 |
<?PHP // ファイルにデータを追加したときのタイムスタンプ $filename = 'somefile.txt'; file_put_contents($filename,"data2",FILE_APPEND); echo "OS:".PHP_OS.PHP_EOL; echo "$filename データ追加 ctime: " . date("F d Y H:i:s.", filectime($filename)).PHP_EOL; echo "$filename データ追加 atime: " . date("F d Y H:i:s.", fileatime($filename)).PHP_EOL; echo "$filename データ追加 mtime: " . date("F d Y H:i:s.", filemtime($filename)).PHP_EOL; ?> |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?PHP // ファイルのアクセス権限を変更したときのタイムスタンプ $filename = 'somefile.txt'; if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { echo 'プロパティのアクセス許可を手動で変更'.PHP_EOL; } else { exec("chmod +x $filename"); }; echo "OS:".PHP_OS.PHP_EOL; echo "$filename 権限変更 ctime: " . date("F d Y H:i:s.", filectime($filename)).PHP_EOL; echo "$filename 権限変更 atime: " . date("F d Y H:i:s.", fileatime($filename)).PHP_EOL; echo "$filename 権限変更 mtime: " . date("F d Y H:i:s.", filemtime($filename)).PHP_EOL; ?> |
結果(Windows)
結果(Linux)
fstat() / stat()
ファイルのタイムスタンプを知るには、 fstat() 関数や stat() 関数を使うこともできます。
fstat() 関数は、オープンしたファイルポインタからファイルに関する情報を取得します。
stat() 関数は、ファイル名を指定してファイルに関する情報を取得します。
fstat
1 |
array fstat( $handle ) |
パラメータ | 型 | 説明 |
---|---|---|
$handle | resource | fopen() を使用して作成したファイルシステムポインタリソース。 |
- ・ファイルの統計情報の配列。
stat
1 |
array stat ( $filename ) |
パラメータ | 型 | 説明 |
---|---|---|
$filename | string | ファイルへのパス。 |
- ・ファイルの統計情報の配列。
なお、ファイルの統計情報の配列のフォーマットは以下のとおりです。
数値 | 連想配列 | 説明 |
---|---|---|
0 | dev | デバイス番号 |
1 | ino | inode番号(Windowsでは0) |
2 | mode | inodeプロテクトモード |
3 | nlink | リンク数 |
4 | uid | 所有者のユーザーID(Windowsでは0) |
5 | gid | 所有者のグループID(Windowsでは0) |
6 | rdev | inodeデバイス の場合、デバイスの種類 |
7 | size | バイト単位のサイズ |
8 | atime | 最終アクセス時間 (Unix タイムスタンプ) |
9 | mtime | 最終修正時間 (Unix タイムスタンプ) |
10 | ctime | 最終 inode変更時間 (Unix タイムスタンプ) |
11 | blksize | ファイル IO のブロックサイズ(Windowsでは-1) |
12 | blocks | 512 バイトのブロックの確保数(Windowsでは-1) |
ファイルを読み書きするには以下の記事を参考にしてください。
まとめ
いかがでしたか? 今回は、PHPでのファイル時刻属性を取り出す関数について説明しました。
ファイル時刻属性は各OSが採用するファイルシステムで管理されており、OSによって扱いが異なる場合があります。タイムスタンプctimeをその例として説明しました。
この記事が、PHPプログラミング学習の参考としてお役に立てば幸いです。