Realpath: примеры (PHP)
realpath(string $path): string|falseФункция realpath() в PHP преобразует относительный или символьный путь в абсолютный канонический путь. Она разрешает все символические ссылки, переходы типа .. и ., а также удаляет лишние разделители.
Основное применение функции — получение реального абсолютного пути к файлу или директории. Это полезно для:
- Проверки существования файла без последующего открытия
- Устранения неоднозначностей в путях при работе с файловой системой
- Безопасного сравнения путей (например, проверки нахождения файла внутри заданной директории)
- Получения нормализованного пути для логирования или отображения
Функция принимает один обязательный параметр:
- path (string) — Путь к файлу или директории, который требуется преобразовать. Может быть относительным, абсолютным или содержать символические ссылки.
Функция возвращает строку с абсолютным каноническим путем или false в случае ошибки (например, если файл не существует).
Пример с относительным путем:
<?php
$path = 'test.txt';
echo realpath($path);
?>/var/www/html/project/test.txt
Пример с переходом на уровень выше:
<?php
$path = '../config/settings.php';
echo realpath($path);
?>/var/www/config/settings.php
Пример с несуществующим файлом:
<?php
$path = 'non_existent_file.txt';
var_dump(realpath($path));
?>bool(false)
Пример с символьной ссылкой (symlink):
<?php
// Предположим, что /var/link указывает на /var/www/html
$path = '/var/link/index.php';
echo realpath($path);
?>/var/www/html/index.php
- basename() — Возвращает конечный компонент имени пути. Используется для получения имени файла из полного пути.
- dirname() — Возвращает путь к родительской директории. Полезен для получения директории, содержащей файл.
- pathinfo() — Возвращает информацию о пути в виде массива (директория, имя файла, расширение). Удобна для разбора путей.
- is_link() — Проверяет, является ли путь символической ссылкой. Используется перед обработкой ссылок.
- readlink() — Возвращает цель символической ссылки. В отличие от realpath(), не разрешает все компоненты пути полностью.
Функцию realpath() предпочтительнее использовать, когда требуется получить абсолютный нормализованный путь для дальнейших файловых операций или проверок безопасности.
Не проверяется, вернула ли функция false:
<?php
$path = realpath('non_existent.txt');
echo 'Путь: ' . $path;
?>Путь:
Последующие операции могут вызвать ошибки:
<?php
$path = realpath('non_existent.txt');
if ($path) {
$content = file_get_contents($path);
}
?>Warning: file_get_contents(): Filename cannot be empty
В более ранних версиях PHP это могло приводить к непредсказуемому поведению:
<?php
$path = realpath("test.txt\0.txt");
var_dump($path);
?>bool(false)
- PHP 8.0: Функция теперь выбрасывает ошибку уровня E_WARNING при передаче пустой строки в качестве параметра. Ранее возвращался false.
- PHP 7.1: На Windows функция теперь нормализует разделители директорий (из / в \).
- PHP 5.3: Добавлена поддержка относительных путей на Windows.
В PHP 8 поведение функции стало более строгим, что помогает быстрее выявлять ошибки в коде.
Безопасная проверка, что запрошенный файл находится внутри проектной директории:
<?php
$baseDir = '/var/www/html/project';
$userPath = $_GET['file'] ?? '';
$realBase = realpath($baseDir);
$realUser = realpath($realBase . '/' . $userPath);
if ($realUser === false || strpos($realUser, $realBase . '/') !== 0) {
die('Доступ запрещен');
}
// Безопасное чтение файла
$content = file_get_contents($realUser);
?>Массовая обработка путей с фильтрацией несуществующих:
<?php
$paths = ['file1.txt', 'file2.txt', 'none.txt'];
$realPaths = array_filter(array_map('realpath', $paths));
print_r($realPaths);
?>Array
(
[0] => /var/www/html/project/file1.txt
[1] => /var/www/html/project/file2.txt
)Нормализация путей для корректного сравнения:
<?php
$path1 = '/var/www/html/project/../project/file.txt';
$path2 = '/var/www/html/project/file.txt';
if (realpath($path1) === realpath($path2)) {
echo 'Пути указывают на один файл';
}
?>Пути указывают на один файл
Функция не работает с потоками (streams) или виртуальными файловыми системами:
<?php
$path = 'php://memory';
var_dump(realpath($path));
?>bool(false)
Функция os.path.realpath() из модуля os.path:
import os
path = 'test.txt'
print(os.path.realpath(path))/home/user/project/test.txt
Метод fs.realpath() из модуля fs:
const fs = require('fs');
fs.realpath('test.txt', (err, resolvedPath) => {
console.log(resolvedPath);
});/home/user/project/test.txt
Функция REAL_PATH() отсутствует. Для работы с путями файлов используются строковые функции, но обычно пути файлов обрабатываются на стороне приложения.
В Python и Node.js функции аналогичны по поведению, но отличаются синтаксисом и способами обработки ошибок (исключения в Python, callback/promise в Node.js). В PHP функция возвращает false при ошибке, что требует дополнительной проверки.