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

PHP fileinode() 函數詳解:獲取文件 Inode 號與文件身份識別應用

     編輯:PHP 相關知識

核心概念

Inode(Index Node)是 Unix/Linux 文件系統中文件的唯一標識符(同分區內)。fileinode() 返回文件的 inode 號,用於判斷同一文件的不同硬鏈接、檢測文件是否被替換、文件系統級去重等場景。

語法與返回值

int fileinode ( string $filename )
  • 成功返回 inode 號(int)。
  • 失敗返回 FALSE 並拋 E_WARNING。

關鍵特性

  • 硬鏈接共享 inode:ln file link 創建的硬鏈接與原文件 inode 相同。
  • 軟鏈接不同 inode:ln -s file link 的符號鏈接有自己獨立的 inode。
  • 跨分區 inode 可能重複:不同文件系統/分區的 inode 獨立編號。
  • Windows 不支援:NTFS 有 File ID 但非 POSIX inode,函數返回 FALSE。

實戰範例

範例 1:檢測當前腳本是否被檢查(防自我引用)

<?php
$filename = 'index.php';
if (getmyinode() == fileinode($filename)) {
    echo '你正在檢查當前執行的文件。';
}
?>

範例 2:查找文件的所有硬鏈接

<?php
function find_hardlinks($file) {
    $target_inode = fileinode($file);
    $target_dev = fileowner($file); // 實際需用 stat()['dev']
    if ($target_inode === false) return [];
    
    $stat = stat($file);
    $dev = $stat['dev'];
    
    $links = [];
    // 掃描同分區掛載點(簡化:僅掃描文件所在目錄樹)
    $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator(dirname($file), RecursiveDirectoryIterator::SKIP_DOTS));
    foreach ($iterator as $f) {
        if ($f->isFile()) {
            $st = $f->getStat(); // 含 dev + ino
            if ($st['ino'] == $target_inode && $st['dev'] == $dev) {
                $links[] = $f->getPathname();
            }
        }
    }
    return $links;
}
?>

範例 3:文件完整性監控(檢測替換)

<?php
class FileIntegrityMonitor {
    private $baseline = [];
    
    public function record($file) {
        $this->baseline[$file] = [
            'inode' => fileinode($file),
            'mtime' => filemtime($file),
            'size' => filesize($file),
            'hash' => hash_file('sha256', $file)
        ];
    }
    
    public function check($file) {
        if (!isset($this->baseline[$file])) return 'unknown';
        $curr = [
            'inode' => fileinode($file),
            'mtime' => filemtime($file),
            'size' => filesize($file),
            'hash' => hash_file('sha256', $file)
        ];
        $base = $this->baseline[$file];
        
        if ($curr['inode'] != $base['inode']) return 'replaced'; // 文件被替換(新 inode)
        if ($curr['hash'] != $base['hash']) return 'modified'; // 內容被修改
        return 'unchanged';
    }
}
?>

注意事項與避坑

  • 緩存機制:受 clearstatcache() 影響,文件系統變更後需清除。
  • 大文件系統:64 位 inode(ext4、XFS、ZFS)在 32 位 PHP 會溢出,需 64 位 PHP。
  • 網絡文件系統:NFS、SMB 等 inode 語義可能不同,謹慎依賴。
  • 性能:stat() 系統調用較重,大量文件批量用 SplFileInfo::getInode() 迭代器模式。

相關函數對比

函數返回用途
fileinode()inode 號文件身份、硬鏈接識別
fileowner()UID文件擁有者
filegroup()GID文件所屬組
fileperms()權限位掩碼完整權限
stat()完整 stat 陣列一次性獲取所有元數據(dev、ino、mode、nlink、uid、gid、size、atime、mtime、ctime)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved