こんにちは!今回は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関数を使用する際は、以下の点に注意しましょう:
- 適切なエラーハンドリングの実装
- タイムゾーンの考慮
- キャッシュのクリア
- パーミッションの確認
- 返値の適切な解釈
これらの点を意識することで、より信頼性の高いファイル時刻管理が可能になります。
 
  
  
  
  