こんにちは!今回はPHPのfilectime
関数について、基本から実践的な使い方まで詳しく解説します。
1. 基本的な使い方
// ファイルの作成時刻を取得
$filename = 'example.txt';
$createTime = filectime($filename);
// 読みやすい形式に変換
echo date('Y-m-d H:i:s', $createTime);
2. 実践的な使用例
2-1. ファイル情報の包括的な取得
function getDetailedFileInfo($filename) {
if (!file_exists($filename)) {
throw new Exception("ファイル '{$filename}' が存在しません");
}
return [
'name' => basename($filename),
'create_time' => filectime($filename),
'modify_time' => filemtime($filename),
'access_time' => fileatime($filename),
'size' => filesize($filename),
'type' => filetype($filename),
'readable' => is_readable($filename),
'writable' => is_writable($filename)
];
}
// 使用例
try {
$info = getDetailedFileInfo('document.txt');
foreach ($info as $key => $value) {
if (in_array($key, ['create_time', 'modify_time', 'access_time'])) {
echo "{$key}: " . date('Y-m-d H:i:s', $value) . "\n";
} else {
echo "{$key}: {$value}\n";
}
}
} catch (Exception $e) {
echo "エラー: " . $e->getMessage();
}
2-2. 最近作成されたファイルの検索
function findRecentFiles($directory, $hours = 24) {
$recentFiles = [];
$currentTime = time();
$threshold = $currentTime - ($hours * 3600);
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($directory)
);
foreach ($files as $file) {
if ($file->isFile()) {
$createTime = filectime($file->getPathname());
if ($createTime > $threshold) {
$recentFiles[] = [
'path' => $file->getPathname(),
'created' => date('Y-m-d H:i:s', $createTime),
'hours_ago' => floor(($currentTime - $createTime) / 3600)
];
}
}
}
return $recentFiles;
}
2-3. ファイルの経過時間監視
class FileAgeMonitor {
private $maxAge;
public function __construct($maxAgeHours = 24) {
$this->maxAge = $maxAgeHours * 3600;
}
public function checkFile($filename) {
if (!file_exists($filename)) {
throw new Exception("ファイルが存在しません");
}
$createTime = filectime($filename);
$age = time() - $createTime;
return [
'file' => $filename,
'age_hours' => floor($age / 3600),
'is_old' => $age > $this->maxAge,
'created_at' => date('Y-m-d H:i:s', $createTime)
];
}
public function monitorDirectory($directory) {
$results = [];
$files = glob($directory . '/*');
foreach ($files as $file) {
try {
$results[] = $this->checkFile($file);
} catch (Exception $e) {
error_log($e->getMessage());
}
}
return $results;
}
}
3. エラーハンドリング
function safeGetCreateTime($filename) {
try {
if (!file_exists($filename)) {
throw new Exception("ファイルが存在しません");
}
if (!is_readable($filename)) {
throw new Exception("ファイルを読み取れません");
}
$createTime = filectime($filename);
if ($createTime === false) {
throw new Exception("作成時刻の取得に失敗しました");
}
clearstatcache(true, $filename);
return [
'timestamp' => $createTime,
'formatted' => date('Y-m-d H:i:s', $createTime)
];
} catch (Exception $e) {
error_log("Error in safeGetCreateTime: " . $e->getMessage());
return false;
}
}
4. タイムゾーンの考慮
function getFileTimesWithTZ($filename, $timezone = 'Asia/Tokyo') {
// 現在のタイムゾーンを保存
$originalTZ = date_default_timezone_get();
try {
// 指定されたタイムゾーンに設定
date_default_timezone_set($timezone);
$createTime = filectime($filename);
$result = [
'create_time' => [
'timestamp' => $createTime,
'formatted' => date('Y-m-d H:i:s', $createTime),
'timezone' => $timezone
]
];
// 元のタイムゾーンに戻す
date_default_timezone_set($originalTZ);
return $result;
} catch (Exception $e) {
// エラーが発生した場合も元のタイムゾーンに戻す
date_default_timezone_set($originalTZ);
throw $e;
}
}
注意点
filectime
はファイルの作成時刻ではなく、iノードの最終変更時刻を返すことがあります。- キャッシュの影響を受けるため、最新の情報を得るには
clearstatcache()
を使用します。 - タイムゾーンの設定が結果に影響を与えます。
- パーミッションの問題でアクセスできない場合、falseが返されます。
まとめ
filectime関数を使用する際は、以下の点に注意しましょう:
- 適切なエラーハンドリングの実装
- タイムゾーンの考慮
- キャッシュのクリア
- パーミッションの確認
- 返値の適切な解釈
これらの点を意識することで、より信頼性の高いファイル時刻管理が可能になります。