realpath_cache_get() 函数返回真实路径缓存(realpath cache)的内容。这是一个PHP内部缓存机制,用于缓存文件系统路径的解析结果,以提高性能。
当PHP多次访问同一个文件路径时,使用真实路径缓存可以避免重复的文件系统调用,从而显著提高性能。这个函数对于调试和了解PHP内部缓存机制非常有用。
realpath_cache_get ( ) : array
返回一个关联数组,包含真实路径缓存中的所有条目。每个条目都是一个数组,包含以下信息:
| 键名 | 描述 |
|---|---|
key |
缓存的键,通常是原始路径 |
is_dir |
是否为目录(布尔值) |
realpath |
规范化的绝对路径 |
expires |
缓存过期时间(UNIX时间戳) |
is_rvalid |
根路径是否有效(布尔值) |
获取并显示真实路径缓存的全部内容:
<?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>";
}
?>
对比不同操作后的缓存变化:
<?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>";
}
}
?>
比较使用缓存和不使用缓存的性能差异:
<?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";
?>
clearstatcache(true)可以手动清除真实路径缓存realpath_cache_size配置限制,超过限制时会淘汰最旧的条目realpath()、file_exists()等文件系统函数