获取 PHP 文件最后修改时间的正确方法

发布时间 - 2026-01-01 00:00:00    点击率:

本文介绍如何准确获取 php 文件的最后修改时间,指出 `stream_get_meta_data()` 无法返回文件时间戳的原因,并推荐使用 `filemtime()` 或 `fstat()` 等专用函数实现。

在 PHP 中,stream_get_meta_data() 返回的是流(stream)的运行时状态信息,例如是否阻塞、是否到达 EOF、封装器类型等,它不包含文件系统层面的元数据(如创建时间、最后访问时间、最后修改时间)。因此,即使你用 fopen() 打开了一个文件,调用 stream_get_meta_data() 也永远不会返回 mtime(最后修改时间)等关键时间戳字段——这正是你得到空结果的根本原因。

要获取文件的最后修改时间,应直接操作文件系统元数据。PHP 提供了多个高效且语义明确的函数:

推荐首选:filemtime()
最简洁、最常用的方式,直接传入文件路径即可:

$filename = 'index.php';
if (file_exists($filename)) {
    $lastModified = filemtime($filename);
    echo "最后修改时间:" . date('Y-m-d H:i:s', $lastModified);
} else {
    echo "文件不存在";
}

进阶选择:fstat()(需已打开文件句柄)
适用于你已在处理文件流且希望复用句柄的场景(如读取同时获取元数据):

$fp = fopen('index.php', 'r');
if ($fp) {
    $stats = fstat($fp);
    echo "最后修改时间:" . date('Y-m-d H:i:s', $stats['mtime']);
    fclose($fp);
}

⚠️ 注意事项:

  • filemtime() 和 fstat() 返回的时间戳均为 Unix 时间戳(秒级),需用 date() 或 DateTime 格式化;
  • 两者均受 PHP 进程的时区设置影响,建议通过 date_default_timezone_set() 统一时区;
  • 若文件被缓存(如 OPcache 启用),filemtime() 仍返回真实文件系统时间,不受字节码缓存干扰;
  • 权限不足或文件被锁定可能导致函数返回 false,务必检查返回值并做错误处理。

总结:不要混淆“流元数据”与“文件元数据”。对于获取最后修改时间这类需求,请始终优先使用 filemtime()(简单直接)或 fstat()(配合已有文件指针),它们专为文件系统属性设计,稳定、可靠、语义清晰。


# php  # 字节  # unix  # stream  # EOF  # 封装  # date  # fopen  # 指针  # 文件系统  # 句柄  # 的是  # 进阶  # 多个  # 已有  # 推荐使用  # 均为  # 这类  # 不受 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 高防服务器:AI智能防御DDoS攻击与数据安全保障  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  新三国志曹操传主线渭水交兵攻略  Laravel安装步骤详细教程_Laravel环境搭建指南  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  原生JS实现图片轮播切换效果  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  EditPlus中的正则表达式 实战(4)  JS碰撞运动实现方法详解  Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】  如何在搬瓦工VPS快速搭建网站?  Python并发异常传播_错误处理解析【教程】  linux写shell需要注意的问题(必看)  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  开心动漫网站制作软件下载,十分开心动画为何停播?  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  如何在宝塔面板中创建新站点?  如何在IIS7上新建站点并设置安全权限?  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  WEB开发之注册页面验证码倒计时代码的实现  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  网页设计与网站制作内容,怎样注册网站?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  Laravel如何使用Vite进行前端资源打包?(配置示例)  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  如何在橙子建站中快速调整背景颜色?  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  教你用AI将一段旋律扩展成一首完整的曲子  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  文字头像制作网站推荐软件,醒图能自动配文字吗?  Mybatis 中的insertOrUpdate操作  网站制作软件免费下载安装,有哪些免费下载的软件网站?  如何在阿里云香港服务器快速搭建网站?  iOS中将个别页面强制横屏其他页面竖屏  如何在局域网内绑定自建网站域名?  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  千库网官网入口推荐 千库网设计创意平台入口