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

Полное руководство по 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
Похожие функции в 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
Некорректная работа с путями, содержащими NULL-байты

В более ранних версиях PHP это могло приводить к непредсказуемому поведению:

<?php
$path = realpath("test.txt\0.txt");
var_dump($path);
?>
bool(false)
Изменения в последних версиях PHP
  • PHP 8.0: Функция теперь выбрасывает ошибку уровня E_WARNING при передаче пустой строки в качестве параметра. Ранее возвращался false.
  • PHP 7.1: На Windows функция теперь нормализует разделители директорий (из / в \).
  • PHP 5.3: Добавлена поддержка относительных путей на Windows.

В PHP 8 поведение функции стало более строгим, что помогает быстрее выявлять ошибки в коде.

Расширенные примеры
Проверка нахождения файла внутри директории

Безопасная проверка, что запрошенный файл находится внутри проектной директории:

Пример php
<?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
<?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
<?php
$path1 = '/var/www/html/project/../project/file.txt';
$path2 = '/var/www/html/project/file.txt';

if (realpath($path1) === realpath($path2)) {
    echo 'Пути указывают на один файл';
}
?>
Пути указывают на один файл
Работа с виртуальными файловыми системами

Функция не работает с потоками (streams) или виртуальными файловыми системами:

Пример php
<?php
$path = 'php://memory';
var_dump(realpath($path));
?>
bool(false)
Аналоги в других языках программирования
Python

Функция os.path.realpath() из модуля os.path:

import os
path = 'test.txt'
print(os.path.realpath(path))
/home/user/project/test.txt
JavaScript (Node.js)

Метод fs.realpath() из модуля fs:

const fs = require('fs');
fs.realpath('test.txt', (err, resolvedPath) => {
    console.log(resolvedPath);
});
/home/user/project/test.txt
MySQL

Функция REAL_PATH() отсутствует. Для работы с путями файлов используются строковые функции, но обычно пути файлов обрабатываются на стороне приложения.

Отличия от PHP

В Python и Node.js функции аналогичны по поведению, но отличаются синтаксисом и способами обработки ошибок (исключения в Python, callback/promise в Node.js). В PHP функция возвращает false при ошибке, что требует дополнительной проверки.

PHP realpath function comments

En
Realpath Returns canonicalized absolute pathname