获取 PHP 文件最后修改时间的正确方法
技术百科
心靈之曲
发布时间:2026-01-01
浏览: 次 本文介绍如何准确获取 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免费学习笔记(深入)”;
# 的是
# 这类
# 多个
# 进阶
# 已有
# 推荐使用
# 不受
# 均为
# 字节
# 指针
# stream
# 封装
# php
# 文件系统
# 句柄
# fopen
# unix
# date
# EOF
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11怎么设置开机自动连接宽带_Windows
- Windows10任务栏图标变成白色文件_Win1
- PHP cURL GET请求:正确设置请求头与身份
- 如何使用Golang实现微服务事件驱动_使用消息总
- 如何在 Go 结构体中正确初始化 map 字段
- Mac怎么设置登录项_Mac管理开机自启动程序【教
- 如何使用Golang捕获并记录协程panic_保证
- php增删改查报错1054怎么办_字段名错误排查修
- Win11怎么关闭边缘滑动手势_Windows11
- mac怎么安装adb_MAC配置Android A
- Win10如何卸载Skype_Win10卸载Sky
- Win11怎么开启远程桌面连接_Windows11
- 如何在 Windows 11 中使用 AlomWa
- Windows10系统怎么查看显卡驱动_Win10
- 如何优化Golang Web性能_Golang H
- Windows怎样关闭锁屏广告_Windows关闭
- 如何使用Golang defer优化性能_减少不必
- php在Linux怎么部署_LNMP环境搭建PHP
- Win11无法拖拽文件到任务栏怎么办_Win11开
- php怎么下载安装后测试是否成功_简单脚本验证方法
- 如何在 Go 中创建包含 map 的 slice(
- Win10任务栏天气和资讯怎么关闭 Win10禁用
- 如何使用Golang实现RPC序列化与反序列化_G
- VSC怎样用终端运行PHP_命令行执行脚本的步骤【
- Python大型项目拆分策略_模块化解析【教程】
- 如何使用Golang reflect检查方法数量_
- 如何使用Golang实现云原生应用弹性伸缩_自动应
- Go 中的 := 运算符:类型推导机制与使用边界详
- 如何将竖排文本文件转换为横排字符串
- 如何使用Golang实现微服务状态监控_Golan
- windows如何禁用驱动程序强制签名_windo
- VSC怎么在PHP中调试MySQL_数据库交互排查
- Go 语言标准库为何不提供泛型切片的 Contai
- 如何使用Golang实现容器自动化运维_Golan
- 如何使用Golang操作指针变量_Golang解引
- Win10怎样安装Word样式库_Win10安装W
- Win11无法识别耳机怎么办_解决Win11插耳机
- 如何使用Golang实现容器健康检查_监控和自动重
- 如何在Golang中验证模块完整性_Golangg
- Win11时间格式怎么改成12小时制 Win11时
- c++的位运算怎么用 与、或、异或、移位操作详解【
- c++怎么操作redis数据库_c++ hired
- php485读数据时阻塞怎么办_php485非阻塞
- php高频调试功能有哪些_php常用调试函数与工具
- win11 OneDrive怎么彻底关闭 Win1
- 如何使用Golang模拟请求超时_Golang c
- Windows电脑如何进入安全模式?(多种按键方法
- c++如何判断文件是否存在_c++ filesys
- 如何使用Golang实现跨域请求支持_Golang
- 如何正确访问 Laravel 模型或对象的属性而非

QQ客服