如何使用PHP修改文件修改时间 优化filemtime缓存测试效率
无需等待修改文件mtime实现缓存快速测试方案
核心思路是跳过自然等待时间流逝的过程,主动修改缓存文件的修改时间属性,精准构造缓存过期/未过期/临界值等各类测试场景,把单轮测试的等待耗时从秒级压缩到毫秒级。
PHP原生代码实现(推荐)
PHP内置的touch()函数原生支持修改文件的修改时间,跨平台兼容性最好,不需要调用外部系统命令,适合直接集成到测试用例中。
// 测试用缓存文件路径 $cacheFilePath = __DIR__ . '/runtime/cache/test_cache.dat'; // 替换为你业务代码里的缓存过期阈值Unix时间戳 $cacheExpireThreshold = time(); // 1. 构造缓存已过期场景:文件mtime比过期阈值早3秒 $expiredMtime = $cacheExpireThreshold - 3; touch($cacheFilePath, $expiredMtime); // 清理PHP文件状态缓存,避免拿到旧的mtime值 clearstatcache(true, $cacheFilePath); // 此时filemtime($cacheFilePath)返回值小于阈值,会触发重查逻辑 // 2. 构造缓存有效场景:文件mtime比过期阈值晚1秒 $validMtime = $cacheExpireThreshold + 1; touch($cacheFilePath, $validMtime); clearstatcache(true, $cacheFilePath); // 此时filemtime返回值大于阈值,会直接命中缓存 // 3. 构造临界场景:文件mtime刚好等于过期阈值 $criticalMtime = $cacheExpireThreshold; touch($cacheFilePath, $criticalMtime); clearstatcache(true, $cacheFilePath);
注意事项
- 执行测试代码的用户需要拥有目标缓存文件的写权限,否则
touch()会抛出权限错误 - 构造测试场景时不要修改缓存文件的实际内容,避免缓存逻辑额外校验文件哈希、大小等属性时干扰测试结果
- 一定要在修改mtime后调用
clearstatcache()清理PHP的文件状态缓存,PHP默认会缓存filemtime、filesize等函数的返回值,不清理会导致测试时拿到旧值判断错误
命令行实现方式
如果测试脚本和业务代码分离,也可以直接通过系统命令修改文件mtime,适合CLI自动化测试场景:
- Linux/macOS 环境:
# 将文件修改时间设置为指定Unix时间戳(示例为1717209600,对应2024-06-01 00:00:00 UTC) touch -m -d @1717209600 ./runtime/cache/test_cache.dat
- Windows 环境(PowerShell):
# 将文件修改时间设置为指定Unix时间戳 (Get-Item ./runtime/cache/test_cache.dat).LastWriteTime = [DateTimeOffset]::FromUnixTimeSeconds(1717209600).LocalDateTime
测试效率优化提示
- 测试环境下建议把缓存过期判断逻辑的阈值抽成可配置参数,方便测试时直接构造各类边界时间点,不用依赖系统当前时间
- 所有涉及文件状态判断的测试用例执行前都可以提前调用
clearstatcache(),避免PHP内置缓存导致的测试结果不稳定
内容的提问来源于stack exchange,提问作者Jordi Morillo
相关产品推荐
相关产品推荐

