PHP realpath_cache_get() 函数

定义和用法

realpath_cache_get() 函数返回真实路径缓存(realpath cache)的内容。这是一个PHP内部缓存机制,用于缓存文件系统路径的解析结果,以提高性能。

当PHP多次访问同一个文件路径时,使用真实路径缓存可以避免重复的文件系统调用,从而显著提高性能。这个函数对于调试和了解PHP内部缓存机制非常有用。

注意: 此函数在PHP 5.3.2及更高版本中可用。

语法

realpath_cache_get ( ) : array

返回值

返回一个关联数组,包含真实路径缓存中的所有条目。每个条目都是一个数组,包含以下信息:

键名 描述
key 缓存的键,通常是原始路径
is_dir 是否为目录(布尔值)
realpath 规范化的绝对路径
expires 缓存过期时间(UNIX时间戳)
is_rvalid 根路径是否有效(布尔值)

示例

示例 1:查看缓存内容

获取并显示真实路径缓存的全部内容:

<?php
// 先访问一些文件路径,让它们被缓存
$path1 = realpath(__DIR__);
$path2 = realpath(__FILE__);
$path3 = realpath(dirname(__DIR__));

// 获取缓存内容
$cache = realpath_cache_get();

echo "<pre>";
print_r($cache);
echo "</pre>";

// 统计缓存条目数量
echo "缓存条目数量: " . count($cache) . "<br>";

// 显示每个条目的详细信息
foreach ($cache as $key => $entry) {
    echo "<hr>";
    echo "原始路径: " . htmlspecialchars($key) . "<br>";
    echo "绝对路径: " . $entry['realpath'] . "<br>";
    echo "是否为目录: " . ($entry['is_dir'] ? '是' : '否') . "<br>";
    echo "过期时间: " . date('Y-m-d H:i:s', $entry['expires']) . "<br>";
    echo "根路径有效: " . ($entry['is_rvalid'] ? '是' : '否') . "<br>";
}
?>
示例 2:监控缓存变化

对比不同操作后的缓存变化:

<?php
// 初始缓存状态
$initialCache = realpath_cache_get();
echo "初始缓存条目数: " . count($initialCache) . "<br>";

// 访问一些新路径
$newPaths = [
    '/tmp',
    '/var',
    '/usr/local'
];

foreach ($newPaths as $path) {
    if (file_exists($path)) {
        $realPath = realpath($path);
        echo "访问路径: {$path} → {$realPath}<br>";
    }
}

// 再次获取缓存
$updatedCache = realpath_cache_get();
echo "更新后缓存条目数: " . count($updatedCache) . "<br>";

// 计算新增条目
$newEntries = array_diff_key($updatedCache, $initialCache);
if (!empty($newEntries)) {
    echo "<br>新增缓存条目:<br>";
    foreach ($newEntries as $key => $entry) {
        echo "- " . htmlspecialchars($key) . " → " . $entry['realpath'] . "<br>";
    }
}
?>
示例 3:缓存性能分析

比较使用缓存和不使用缓存的性能差异:

<?php
// 测试文件路径
$testFile = __FILE__;

// 测试1:不使用缓存(每次都清除缓存)
echo "<h4>测试1:不使用缓存</h4>";
$time1 = microtime(true);

for ($i = 0; $i < 1000; $i++) {
    clearstatcache(true); // 清除真实路径缓存
    realpath($testFile);
}

$time2 = microtime(true);
echo "耗时: " . round(($time2 - $time1) * 1000, 2) . " 毫秒<br>";

// 测试2:使用缓存
echo "<h4>测试2:使用缓存</h4>";
$time3 = microtime(true);

for ($i = 0; $i < 1000; $i++) {
    realpath($testFile);
}

$time4 = microtime(true);
echo "耗时: " . round(($time4 - $time3) * 1000, 2) . " 毫秒<br>";

// 性能提升计算
$improvement = (($time2 - $time1) - ($time4 - $time3)) / ($time2 - $time1) * 100;
echo "<h4>性能提升: " . round($improvement, 1) . "%</h4>";

// 显示当前缓存大小
$cacheSize = memory_get_usage(true);
echo "当前内存使用: " . round($cacheSize / 1024, 2) . " KB";
?>

相关配置

PHP的真实路径缓存可以通过以下php.ini配置进行调整:

配置项 默认值 描述
realpath_cache_size 4096K (4MB) 真实路径缓存的最大大小
realpath_cache_ttl 120 (秒) 缓存条目的生存时间(TTL)
检查当前配置
<?php
echo "realpath_cache_size: " . ini_get('realpath_cache_size') . "<br>";
echo "realpath_cache_ttl: " . ini_get('realpath_cache_ttl') . " 秒<br>";

// 获取当前缓存的实际使用情况
$cache = realpath_cache_get();
$cacheSize = 0;

foreach ($cache as $entry) {
    // 估算每个条目的大小(粗略估计)
    $cacheSize += strlen(serialize($entry));
}

echo "当前缓存条目数: " . count($cache) . "<br>";
echo "当前缓存大小(估算): " . round($cacheSize / 1024, 2) . " KB";
?>

注意事项

重要提示
  • 真实路径缓存是PHP进程级别的,多个请求之间会共享(如PHP-FPM模式下)
  • 缓存条目有TTL(生存时间),过期后会被自动清除
  • 使用clearstatcache(true)可以手动清除真实路径缓存
  • 缓存大小受realpath_cache_size配置限制,超过限制时会淘汰最旧的条目
  • 在文件系统频繁变化的开发环境中,可能需要调整缓存TTL或手动清除缓存
  • 真实路径缓存主要影响realpath()file_exists()等文件系统函数