首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP filemtime() 函數詳解:獲取文件修改時間、緩存機制與實戰應用場景

     編輯:PHP 相關知識

函數原型

filemtime(string $filename): int|false
  • 返回:Unix 時間戳(秒),失敗返回 false
  • 含義:文件內容最後被修改的時間(非訪問時間、非 inode 變更時間)

基本用法

<?php
$file = 'test.txt';

$timestamp = filemtime($file);
if ($timestamp !== false) {
    echo "原始時間戳: $timestamp\n";
    echo "格式化時間: " . date('Y-m-d H:i:s', $timestamp) . "\n";
    // 輸出示例:
    // 原始時間戳: 1704720000
    // 格式化時間: 2024-01-08 14:30:00
} else {
    echo "文件不存在或無權限";
}

核心特性與陷阱

1. 結果被緩存

PHP 為提升性能會緩存 stat() 系統調用結果(包含 filemtime、filesize、is_file 等)。

<?php
$file = 'cache.txt';
echo filemtime($file); // 1704720000

// 外部程序修改了文件
// sleep(1); touch($file); // 模擬修改

echo filemtime($file); // 可能仍返回 1704720000(舊緩存)

// 必須清除緩存
clearstatcache();
echo filemtime($file); // 返回新時間戳

最佳實踐:在同一腳本多次檢查同一文件時,調用 clearstatcache(true, $filename)(PHP 5.3+ 支持針對特定文件清除)。

2. 区別三個時間

函數含義典型用途
filemtime內容修改時間緩存失效判斷、版本號生成
fileatime最後訪問時間文件熱度分析(多文件系統默認關閉)
filectimeinode 變更時間(權限、所有者、重命名、移動)安全審計、同步工具

3. 目錄也適用

<?php
$dir = '/var/www/html';
echo "目錄修改時間: " . date('Y-m-d H:i:s', filemtime($dir));
// 注意:目錄修改時間指「目錄項增減」(文件創建/刪除/重命名),不包含子文件內容修改

實戰應用場景

1. 靜態資源版本號(防緩存)

<?php
function assetVersion(string $path): string
{
    $fullPath = $_SERVER['DOCUMENT_ROOT'] . $path;
    $mtime = @filemtime($fullPath);
    return $mtime ? "{$path}?v={$mtime}" : $path;
}

// 模板中使用
// 
// 輸出: /css/app.css?v=1704720000
// 文件修改後自動更新版本號,瀏覽器強制重新下載

2. 文件緩存失效判斷

<?php
function getCachedData(string $cacheFile, int $ttl = 3600): mixed
{
    if (!is_file($cacheFile)) return null;
    
    // 檢查是否過期
    if (time() - filemtime($cacheFile) > $ttl) {
        @unlink($cacheFile); // 刪除過期緩存
        return null;
    }
    
    return unserialize(file_get_contents($cacheFile));
}

function setCachedData(string $cacheFile, mixed $data): void
{
    @file_put_contents($cacheFile, serialize($data));
}

3. 監控文件變化觸發重載

<?php
// 開發環境熱重載示例
$configFile = 'config.php';
$lastMtime = 0;

while (true) {
    $currentMtime = filemtime($configFile);
    if ($currentMtime > $lastMtime) {
        echo "配置文件已變更,重新載入...\n";
        clearstatcache(true, $configFile);
        $config = require $configFile;
        $lastMtime = $currentMtime;
        // 觸發業務重載邏輯
    }
    sleep(1);
}

4. 部署腳本:僅同步修改過的文件

<?php
// 簡易增量部署
$source = '/project/src';
$target = '/var/www/html';

$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source));
foreach ($iterator as $file) {
    if ($file->isFile()) {
        $relPath = substr($file->getPathname(), strlen($source) + 1);
        $targetFile = $target . '/' . $relPath;
        
        $sourceMtime = $file->getMTime();
        $targetMtime = @filemtime($targetFile);
        
        if ($targetMtime === false || $sourceMtime > $targetMtime) {
            @mkdir(dirname($targetFile), 0755, true);
            copy($file->getPathname(), $targetFile);
            echo "已更新: $relPath\n";
        }
    }
}

跨平台注意事項

  • Windows:FAT32 文件系統時間精度為 2 秒;NTFS 為 100 奈秒。
  • NFS/網絡文件系統:時間戳取決於服務器時鐘,客戶端時鐘不同步會導致異常。
  • PHP 版本:PHP 8.0+ 返回 false 而非 0 表示失敗,嚴格類型需用 === false 判斷。

性能優化建議

  1. 批量檢查時,使用 SplFileInfo::getMTime() 避免重複路徑解析。
  2. 高頻調用場景(如每請求檢查配置文件),考慮用 inotify 擴展實現事件驅動而非輪詢。
  3. 緩存 filemtime 結果到 Redis/APCu,減少系統調用。

filemtime() 是文件系統操作的基石,理解其緩存機制與三時間區別,能讓你構建出可靠的緩存失效、版本控制、熱重載與部署自動化系統。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved