Inode(Index Node)是 Unix/Linux 文件系統中文件的唯一標識符(同分區內)。fileinode() 返回文件的 inode 號,用於判斷同一文件的不同硬鏈接、檢測文件是否被替換、文件系統級去重等場景。
int fileinode ( string $filename )
int)。FALSE 並拋 E_WARNING。ln file link 創建的硬鏈接與原文件 inode 相同。ln -s file link 的符號鏈接有自己獨立的 inode。FALSE。<?php
$filename = 'index.php';
if (getmyinode() == fileinode($filename)) {
echo '你正在檢查當前執行的文件。';
}
?>
<?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;
}
?>
<?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() 影響,文件系統變更後需清除。stat() 系統調用較重,大量文件批量用 SplFileInfo::getInode() 迭代器模式。| 函數 | 返回 | 用途 |
|---|---|---|
| fileinode() | inode 號 | 文件身份、硬鏈接識別 |
| fileowner() | UID | 文件擁有者 |
| filegroup() | GID | 文件所屬組 |
| fileperms() | 權限位掩碼 | 完整權限 |
| stat() | 完整 stat 陣列 | 一次性獲取所有元數據(dev、ino、mode、nlink、uid、gid、size、atime、mtime、ctime) |