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 или изменение конфигурации.
Разрешает имя файла относительно путей 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
// Выполним несколько операций с файлами
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
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
$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
// Предположим, что /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 Это символическая ссылка? Да
Альтернативы в других языках
Функция os.path.realpath() возвращает канонический путь, устраняя символические ссылки. Python не предоставляет встроенного механизма для получения всего кеша путей, аналогичного PHP. Кеширование может быть реализовано вручную с использованием словаря.
import os
path = os.path.realpath('example.txt')
print(path)/home/user/example.txt
В 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 нет прямой аналогии. Для путей файловой системы используются функции загрузки файлов, но без встроенного кеширования путей, как в PHP.