PHP realpath() 函数

定义和用法

realpath() 函数返回规范化的绝对路径名。它会解析所有符号链接,处理路径中的 ./../ 和多余的 /,并返回最终的绝对路径。

这个函数在需要获取文件或目录的绝对路径时非常有用,特别是在处理相对路径或包含符号链接的路径时。

语法

realpath ( string $path ) : string|false

参数

参数 描述
path 要检查的路径。必需参数。可以是相对路径或绝对路径。

返回值

  • 成功时:返回规范化的绝对路径名(字符串)
  • 失败时:返回 false,通常是当:
    • path 参数指定的文件不存在
    • 路径中的某个目录没有执行权限
    • 在 PHP 5.3.0 之前,如果路径中的符号链接指向不存在的文件,也会返回 false
注意: 从 PHP 5.3.0 开始,即使符号链接指向不存在的文件,realpath() 仍然能够解析路径,返回一个有效的绝对路径。

示例

示例 1:基本用法

将相对路径转换为绝对路径:

<?php
// 假设当前工作目录是 /var/www/html
$relative_path = './uploads/file.txt';
$absolute_path = realpath($relative_path);

if ($absolute_path !== false) {
    echo "相对路径: {$relative_path}<br>";
    echo "绝对路径: {$absolute_path}";
} else {
    echo "文件不存在或无法访问";
}
?>

可能的输出:

相对路径: ./uploads/file.txt
绝对路径: /var/www/html/uploads/file.txt
示例 2:处理包含 .. 的路径

realpath() 会解析路径中的 ..

<?php
// 假设当前目录是 /var/www/html/test
$path = '../uploads/../config/config.php';
$real_path = realpath($path);

if ($real_path !== false) {
    echo "原始路径: {$path}<br>";
    echo "规范路径: {$real_path}";
} else {
    echo "路径无效";
}
?>

可能的输出:

原始路径: ../uploads/../config/config.php
规范路径: /var/www/html/config/config.php
示例 3:解析符号链接

realpath() 会解析符号链接:

<?php
// 假设 /var/www/html/current 是一个指向 /var/www/html/releases/v1.0 的符号链接
$link_path = '/var/www/html/current/config.php';
$real_path = realpath($link_path);

if ($real_path !== false) {
    echo "符号链接路径: {$link_path}<br>";
    echo "实际路径: {$real_path}";
} else {
    echo "路径无效";
}
?>

可能的输出:

符号链接路径: /var/www/html/current/config.php
实际路径: /var/www/html/releases/v1.0/config.php
示例 4:错误处理

处理不存在的路径:

<?php
$paths = [
    'existing_file.txt',
    'non_existing_file.txt',
    '/tmp',
    '/nonexistent/directory'
];

foreach ($paths as $path) {
    $real = realpath($path);

    if ($real !== false) {
        echo "✓ '{$path}' 的绝对路径是: {$real}<br>";
    } else {
        echo "✗ 无法获取 '{$path}' 的绝对路径<br>";
    }
}
?>

注意事项

重要提示
  • realpath() 会缓存解析后的路径。使用 clearstatcache() 清除缓存以获得最新结果
  • 函数不仅解析符号链接,还会解析路径中的 ... 和多余的斜杠
  • 在 Windows 系统中,路径分隔符会被转换为反斜杠(\)
  • 即使文件不存在,realpath() 也可能返回一个路径(前提是路径中的目录都存在且有权限)
  • 如果路径中的某个目录没有执行权限,函数可能返回 false
缓存问题示例
<?php
// 第一次调用
echo "第一次: " . realpath('/path/to/file') . "<br>";

// 假设文件被移动或删除
// 需要清除缓存才能获得最新结果
clearstatcache();

// 第二次调用
echo "清除缓存后: " . realpath('/path/to/file');
?>