Realpath cache get: примеры (PHP)

Использование realpath_cache_get для работы с кешем путей в PHP
Раздел: Работа с файловой системой
realpath_cache_get: array

Функция realpath_cache_get в PHP

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

Функция вызывается без аргументов и возвращает ассоциативный массив. Каждый ключ массива — это исходный путь (как он был передан в функции вроде realpath(), file_exists() и др.), а значение — массив с данными о закэшированном реальном пути.

Структура элемента кеша:
key — исходный путь, запрошенный для разрешения.
value — массив с ключами:
realpath: окончательный абсолютный реальный путь.
expires: время истечения срока действия записи в кеше (timestamp).
is_dir: булево значение, является ли путь директорией.
is_file: булево значение, является ли путь файлом.
is_link: булево значение, является ли путь символической ссылкой.
mtime: время последней модификации файла/директории.

Использование функции полезно для отладки и анализа производительности, чтобы понять, какие пути кешируются и как долго они хранятся.

Примеры использования realpath_cache_get

Базовый пример получения всего кеша
<?php
// Выполним несколько операций с файлами
$path1 = realpath(__DIR__ . '/../');
$path2 = realpath(__DIR__ . '/./');
file_exists(__FILE__);

// Получим содержимое кеша
$cache = realpath_cache_get();
print_r($cache);
?>
Array
(
    ['/var/www/project'] => Array
        (
            [realpath] => /var/www/project
            [expires] => 1678891234
            [is_dir] => 1
            [is_file] => 
            [is_link] => 
            [mtime] => 1678880000
        )
    ['/var/www/project/index.php'] => Array
        (
            [realpath] => /var/www/project/index.php
            [expires] => 1678891234
            [is_dir] => 
            [is_file] => 1
            [is_link] => 
            [mtime] => 1678880000
        )
)
Пример проверки записи о конкретном файле
<?php
// Запрос реального пути
$real = realpath(__FILE__);

// Получение кеша
$cache = realpath_cache_get();

// Проверка наличия текущего файла в кеше
if (isset($cache[__FILE__])) {
    echo 'Кешированная запись для ' . __FILE__ . ':
';
    print_r($cache[__FILE__]);
}
?>
Кешированная запись для /var/www/project/script.php:
Array
(
    [realpath] => /var/www/project/script.php
    [expires] => 1678891234
    [is_dir] => 
    [is_file] => 1
    [is_link] => 
    [mtime] => 1678880000
)

Похожие функции в PHP

Основная функция для преобразования относительного пути или пути с символическими ссылками в канонический абсолютный путь. realpath_cache_get() показывает кеш, который используется этой функцией для ускорения повторных вызовов.

Очищает кеш состояний файлов, который хранит информацию, возвращаемую функциями stat(), file_exists(), is_file() и другими. Не очищает кеш реальных путей, возвращаемый realpath_cache_get(). Для очистки кеша реальных путей используется realpath_cache_size() с установкой размера кеша в 0 или изменение конфигурации.

stream_resolve_include_path()

Разрешает имя файла относительно путей include, но не затрагивает кеш реальных путей. Полезна для поиска файлов в include_path, но не кеширует результаты как realpath.

Типичные ошибки при использовании

Ожидание обновления кеша в реальном времени

Кеш реальных путей имеет время жизни. Если файл удален или изменен, информация в кеше может устареть до истечения срока действия. Прямое удаление файла не приведет к немедленному обновлению кеша.

<?php
$file = 'test.txt';
file_exists($file); // Добавляет запись в кеш
unlink($file); // Удаление файла
// Кеш все еще содержит запись
$cache = realpath_cache_get();
if (isset($cache[$file])) {
    echo 'Файл в кеше, но физически удален.';
}
?>
Файл в кеше, но физически удален.
Путаница с относительными путями

Функция realpath_cache_get() возвращает ключи в том виде, в котором они были запрошены. Если запрашивался относительный путь, то ключ будет относительным, а не абсолютным.

<?php
realpath('./index.php');
$cache = realpath_cache_get();
// Ключ будет './index.php', а не абсолютный путь
print_r(array_keys($cache));
?>
Array
(
    [0] => ./index.php
)

Изменения в последних версиях PHP

В PHP 8.0 не было внесено значительных изменений в работу функции realpath_cache_get(). Однако, начиная с PHP 7.1, улучшена обработка кеша реальных путей для символических ссылок в Windows. В PHP 8.1 и 8.2 также не было существенных изменений, связанных с этой функцией.

Важно отметить, что поведение кеша реальных путей может зависеть от настроек realpath_cache_size и realpath_cache_ttl в php.ini, которые были стабильны в последних версиях.

Расширенные примеры использования

Мониторинг заполненности кеша

Пример проверки размера кеша и количества элементов для анализа производительности.

Пример php
<?php
// Выполним несколько операций с файлами
for ($i = 0; $i < 100; $i++) {
    file_exists(__DIR__ . '/file' . $i . '.txt');
}

$cache = realpath_cache_get();
$count = count($cache);
$size = realpath_cache_size();

echo 'Количество записей в кеше: ' . $count . '
';
echo 'Размер кеша: ' . $size . ' байт
';
?>
Количество записей в кеше: 100
Размер кеша: 16384 байт
Анализ времени жизни записей

Проверка, какие записи скоро истекают, для понимания поведения кеша.

Пример php
<?php
realpath(__FILE__);
$cache = realpath_cache_get();
$now = time();

foreach ($cache as $path => $data) {
    $remaining = $data['expires'] - $now;
    if ($remaining < 10) {
        echo 'Запись для ' . $path . ' истечет через ' . $remaining . ' секунд.
';
    }
}
?>
Запись для /var/www/project/script.php истечет через 5 секунд.
Сравнение кеша до и после операции

Полезно для отладки, чтобы увидеть, какие пути добавились в кеш после выполнения определенных действий.

Пример php
<?php
$cacheBefore = realpath_cache_get();

// Выполняем новую операцию
$newPath = realpath(__DIR__ . '/../vendor');

$cacheAfter = realpath_cache_get();
$newEntries = array_diff_key($cacheAfter, $cacheBefore);

if (!empty($newEntries)) {
    echo 'Новые записи в кеше:
';
    print_r($newEntries);
}
?>
Новые записи в кеше:
Array
(
    ['/var/www/project/vendor'] => Array
        (
            [realpath] => /var/www/project/vendor
            [expires] => 1678891234
            [is_dir] => 1
            [is_file] => 
            [is_link] => 
            [mtime] => 1678880000
        )
)
Работа с символическими ссылками

Пример показывает, как кешируются пути, содержащие символические ссылки.

Пример php
<?php
// Предположим, что /var/www/project/link -> /var/www/project/real
$path = realpath('/var/www/project/link');
$cache = realpath_cache_get();

if (isset($cache['/var/www/project/link'])) {
    echo 'Исходный путь: /var/www/project/link
';
    echo 'Реальный путь: ' . $cache['/var/www/project/link']['realpath'] . '
';
    echo 'Это символическая ссылка? ' . ($cache['/var/www/project/link']['is_link'] ? 'Да' : 'Нет') . '
';
}
?>
Исходный путь: /var/www/project/link
Реальный путь: /var/www/project/real
Это символическая ссылка? Да

Альтернативы в других языках

Python: os.path.realpath

Функция os.path.realpath() возвращает канонический путь, устраняя символические ссылки. Python не предоставляет встроенного механизма для получения всего кеша путей, аналогичного PHP. Кеширование может быть реализовано вручную с использованием словаря.

import os
path = os.path.realpath('example.txt')
print(path)
/home/user/example.txt
JavaScript (Node.js): fs.realpathSync

В Node.js fs.realpathSync() синхронно возвращает канонический путь. Кеширование путей может управляться через параметр cache в асинхронной версии fs.realpath(), где можно передать объект для кеширования.

const fs = require('fs');
const path = fs.realpathSync('./example.txt');
console.log(path);
/home/user/example.txt
MySQL: REALPATH

В MySQL нет прямой аналогии. Для путей файловой системы используются функции загрузки файлов, но без встроенного кеширования путей, как в PHP.

PHP realpath_cache_get function comments

En
Realpath cache get Get realpath cache entries