Fileinode: примеры (PHP)
fileinode(string $filename): int|falseФункция fileinode() в PHP возвращает номер индексного дескриптора (inode) для указанного файла. Индексный дескриптор — это уникальный идентификатор файла в файловой системе, используемый для хранения метаданных.
Функция применяется для получения числового идентификатора файла, который может использоваться для проверки, указывают ли два разных пути на один и тот же физический файл (сравнение inode). Это полезно при работе с жёсткими ссылками или при отслеживании уникальных файлов в системе.
Функция принимает единственный обязательный параметр:
- filename (string) — путь к файлу, для которого требуется получить номер индексного дескриптора.
Если параметр является директорией, функция также вернёт её inode. При ошибке (например, если файл не существует) возвращается false.
<?php
$inode = fileinode('example.txt');
echo $inode;
?>1234567
<?php
$filename = 'example.txt';
if (file_exists($filename)) {
echo fileinode($filename);
} else {
echo 'Файл не найден';
}
?>1234567
<?php
$inode1 = fileinode('file1.txt');
$inode2 = fileinode('file2.txt');
if ($inode1 && $inode2 && $inode1 === $inode2) {
echo 'Это один и тот же файл (жёсткая ссылка)';
} else {
echo 'Разные файлы';
}
?>Разные файлы
Функция stat() возвращает массив с полной статистикой файла, включая inode (элемент массива с ключом 'ino'). Используется, когда требуется несколько метаданных одновременно.
Аналогична stat(), но для символических ссылок возвращает информацию о самой ссылке, а не о целевом файле.
Класс SplFileInfo из расширения SPL предоставляет объектно-ориентированный интерфейс для получения информации о файле, включая метод getInode().
fileinode() оптимальна для быстрого получения только номера inode. stat() или SplFileInfo предпочтительнее при необходимости множества данных о файле (размер, время изменения, права доступа).
Вызов функции для несуществующего пути приводит к возврату false и генерации предупреждения.
<?php
$result = fileinode('missing_file.txt');
var_dump($result);
?>Warning: fileinode(): stat failed for missing_file.txt in ... bool(false)
Inode может быть нулевым, что интерпретируется как false в булевом контексте.
<?php
if (!fileinode('file_with_inode_0.txt')) {
echo 'Файл не найден или inode равен 0';
}
?>Файл не найден или inode равен 0
Функция работает только с локальными файловыми системами.
<?php
$result = fileinode('http://example.com/file.txt');
var_dump($result);
?>Warning: fileinode(): stat failed for http://example.com/file.txt in ... bool(false)
Функция fileinode() остаётся стабильной и неизменной в течение многих версий PHP. В PHP 8.0 не было внесено существенных изменений в её поведение или сигнатуру. Однако, начиная с PHP 8.0, ошибки типа "failed to stat" теперь вызывают предупреждение E_WARNING, как и в предыдущих версиях. Важно отметить, что в PHP 8 была улучшена внутренняя обработка ошибок, но это не повлияло на внешнее поведение функции.
Отслеживание, был ли файл заменён (его inode изменился).
<?php
$filename = 'config.json';
$initialInode = fileinode($filename);
// ... время проходит, возможна замена файла
$currentInode = fileinode($filename);
if ($currentInode !== $initialInode) {
echo 'Внимание: файл был заменён!';
}
?>Внимание: файл был заменён!
Обход директории для поиска файлов с одинаковым inode.
<?php
$targetInode = fileinode('original.txt');
$hardLinks = [];
$dir = new DirectoryIterator('.');
foreach ($dir as $file) {
if ($file->isFile() && $file->getInode() === $targetInode) {
$hardLinks[] = $file->getFilename();
}
}
print_r($hardLinks);
?>Array
(
[0] => original.txt
[1] => hardlink.txt
)Сохранение inode в кэше для уменьшения количества системных вызовов.
<?php
function getCachedInode($filename) {
static $cache = [];
if (!array_key_exists($filename, $cache)) {
$cache[$filename] = fileinode($filename);
}
return $cache[$filename];
}
echo getCachedInode('large_file.dat');
?>9876543
Сравнение inode самой ссылки и целевого файла.
<?php
$linkInode = fileinode('symlink.txt'); // inode ссылки
$targetInode = fileinode(readlink('symlink.txt')); // inode цели
if ($linkInode !== $targetInode) {
echo 'Это символическая ссылка';
}
?>Это символическая ссылка
В Python используется метод os.stat(), возвращающий объект с полями, включая st_ino.
import os
stat_info = os.stat('example.txt')
print(stat_info.st_ino)1234567
В Node.js информация о inode доступна через метод stat() модуля fs.
const fs = require('fs');
fs.stat('example.txt', (err, stats) => {
if (err) throw err;
console.log(stats.ino);
});1234567
Прямого аналога в SQL нет, так как inode — это концепция файловой системы, а не базы данных.
В отличие от PHP, где fileinode() возвращает только число, в Python и Node.js inode является частью более сложной структуры данных, что требует дополнительного извлечения.