1

Fileinode: примеры (PHP)

Работа с индексными дескрипторами в PHP через fileinode
Раздел: Работа с файловой системой
fileinode(string $filename): int|false

Функция fileinode() в PHP возвращает номер индексного дескриптора (inode) для указанного файла. Индексный дескриптор — это уникальный идентификатор файла в файловой системе, используемый для хранения метаданных.

Назначение функции

Функция применяется для получения числового идентификатора файла, который может использоваться для проверки, указывают ли два разных пути на один и тот же физический файл (сравнение inode). Это полезно при работе с жёсткими ссылками или при отслеживании уникальных файлов в системе.

Аргументы функции

Функция принимает единственный обязательный параметр:

  • filename (string) — путь к файлу, для которого требуется получить номер индексного дескриптора.

Если параметр является директорией, функция также вернёт её inode. При ошибке (например, если файл не существует) возвращается false.

Базовые примеры использования
Получение inode файла
<?php
$inode = fileinode('example.txt');
echo $inode;
?>
1234567
Проверка существования файла перед вызовом
<?php
$filename = 'example.txt';
if (file_exists($filename)) {
    echo fileinode($filename);
} else {
    echo 'Файл не найден';
}
?>
1234567
Сравнение inode двух файлов
<?php
$inode1 = fileinode('file1.txt');
$inode2 = fileinode('file2.txt');
if ($inode1 && $inode2 && $inode1 === $inode2) {
    echo 'Это один и тот же файл (жёсткая ссылка)';
} else {
    echo 'Разные файлы';
}
?>
Разные файлы
Похожие функции в PHP

Функция stat() возвращает массив с полной статистикой файла, включая inode (элемент массива с ключом 'ino'). Используется, когда требуется несколько метаданных одновременно.

Аналогична stat(), но для символических ссылок возвращает информацию о самой ссылке, а не о целевом файле.

spl_file_info

Класс 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
Использование с URL

Функция работает только с локальными файловыми системами.

<?php
$result = fileinode('http://example.com/file.txt');
var_dump($result);
?>
Warning: fileinode(): stat failed for http://example.com/file.txt in ...
bool(false)
Изменения в последних версиях PHP

Функция fileinode() остаётся стабильной и неизменной в течение многих версий PHP. В PHP 8.0 не было внесено существенных изменений в её поведение или сигнатуру. Однако, начиная с PHP 8.0, ошибки типа "failed to stat" теперь вызывают предупреждение E_WARNING, как и в предыдущих версиях. Важно отметить, что в PHP 8 была улучшена внутренняя обработка ошибок, но это не повлияло на внешнее поведение функции.

Расширенные примеры применения
Мониторинг изменений файла по inode

Отслеживание, был ли файл заменён (его 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 для оптимизации

Сохранение 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

В Python используется метод os.stat(), возвращающий объект с полями, включая st_ino.

import os
stat_info = os.stat('example.txt')
print(stat_info.st_ino)
1234567
JavaScript (Node.js)

В Node.js информация о inode доступна через метод stat() модуля fs.

const fs = require('fs');
fs.stat('example.txt', (err, stats) => {
    if (err) throw err;
    console.log(stats.ino);
});
1234567
MySQL

Прямого аналога в SQL нет, так как inode — это концепция файловой системы, а не базы данных.

Основные отличия

В отличие от PHP, где fileinode() возвращает только число, в Python и Node.js inode является частью более сложной структуры данных, что требует дополнительного извлечения.

PHP fileinode function comments

En
Fileinode Gets file inode