filemtime

(PHP 4, PHP 5, PHP 7, PHP 8)

filemtime获取文件修改时间

描述

filemtime(string $filename): int|false

此函数返回文件数据块被写入的时间,也就是文件内容被更改的时间。

参数

filename

文件路径。

返回值

返回文件最后修改的时间,如果失败则返回 false。时间以 Unix 时间戳形式返回,适用于 date() 函数。

错误/异常

如果失败,将发出 E_WARNING 错误。

示例

示例 #1 filemtime() 示例

<?php
// 输出例如 somefile.txt 最后修改时间:2002 年 12 月 29 日 22:16:23.

$filename = 'somefile.txt';
if (
file_exists($filename)) {
echo
"$filename was last modified: " . date ("F d Y H:i:s.", filemtime($filename));
}
?>

备注

注意:

注意,不同文件系统的时间分辨率可能不同。

注意: 此函数的结果被缓存。有关更多详细信息,请参阅 clearstatcache()

提示

从 PHP 5.0.0 开始,此函数也可以用于某些 URL 包装器。请参考 支持的协议和包装器 以确定哪些包装器支持 stat() 函数族的功能。

参见

  • filectime() - 获取文件的 inode 更改时间
  • stat() - 获取有关文件的信息
  • touch() - 设置文件的访问和修改时间
  • getlastmod() - 获取页面最后修改的时间

添加备注

用户贡献备注 30 个备注

259
geeks at geekman dot info
16 年前
这是一个非常方便的函数,用于处理浏览器缓存。例如,假设您有一个样式表,并且您想确保每个人都拥有最新版本。您可以在每次编辑时重命名它,但这会很麻烦。相反,您可以这样做

<?php
echo '<link rel="stylesheet" type="text/css" href="style.css?' . filemtime('style.css') . '" />';
?>

示例输出

<link rel="stylesheet" type="text/css" href="style.css?1203291283" />

通过将 GET 值(UNIX 时间戳)附加到样式表 URL,您让浏览器认为样式表是动态的,因此它会在修改日期更改时重新加载样式表。
68
paranoid at dds dot nl
21 年前
要获取目录的最后修改时间,您可以使用以下代码

<pre>
$getLastModDir = filemtime("/path/to/directory/.");
</pre>

请注意最后一个点,它需要将目录视为文件,才能实际获取它的最后修改日期。

当您希望在网站首页只有一个“最后更新”信息,并且仍然考虑到网站的所有文件时,这非常有用。

此致
Frank Keijzers
7
habazi at yahoo dot com
19 年前
"这并不(一定)正确,目录的修改时间将是目录中最后一次文件*创建*的时间(而不是它子目录中的时间)。"

这也不一定正确。在 *nix 中,时间戳可以独立设置。例如,命令“touch directory”会更新目录的时间戳,而无需创建文件。

此外,删除文件也会更新目录的时间戳。
4
solarijj at gmail dot com
17 年前
要获取某个远程文件的修改日期,您可以使用 notepad at codewalker dot com 提供的优秀函数(经过 dma05 at web dot de 和 madsen at lillesvin dot net 的改进)。

但现在您可以使用 stream_get_meta_data(PHP>4.3.0)更轻松地实现相同的结果。

但是,如果发生重定向,可能会出现问题。在这种情况下,服务器 HTTP 响应不包含 Last-Modified 标头,但包含一个 Location 标头,指示在何处查找文件。下面的函数会处理任何重定向,即使是多个重定向,以便您找到要获取最后修改日期的真实文件。

你好
JJS。

<?php

// 获取远程文件最后修改日期(返回 Unix 时间戳)
function GetRemoteLastModified( $uri )
{
// 默认值
$unixtime = 0;

$fp = fopen( $uri, "r" );
if( !
$fp ) {return;}

$MetaData = stream_get_meta_data( $fp );

foreach(
$MetaData['wrapper_data'] as $response )
{
// 情况:重定向
if( substr( strtolower($response), 0, 10 ) == 'location: ' )
{
$newUri = substr( $response, 10 );
fclose( $fp );
return
GetRemoteLastModified( $newUri );
}
// 情况:最后修改时间
elseif( substr( strtolower($response), 0, 15 ) == 'last-modified: ' )
{
$unixtime = strtotime( substr($response, 15) );
break;
}
}
fclose( $fp );
return
$unixtime;
}
?>
2
MarkAgius at markagius dot co dot uk
2 年前
filemtime(..) 仅适用于服务器上的文件。
$T=filesize("index.php"); // 工作。
$T=filesize("/public_html/dir/index.php"); // 工作。

但是以下代码将无法工作。
$T=filesize("https://mydomain.com/dir/index.php"); // 无法工作。相同域名,但使用网络地址。
$T=filesize("https://otherdomain.com/dir/index.php"); // 其他域名,无法工作。

要获取其他网站的文件日期,请尝试
(注意:时区可能为格林威治标准时间,而不是您的本地时区)

$T = getFileDate("https://mydomain.com/dir/index.php");
$T = getFileDate("https://otherdomain.com/dir/index.php");

function getFileDate($filePath){
// 与 filemtime(..) 相同,但也能处理远程文件。
// 例如: = print date("j/m/Y, g:i:sa (e)",getFileDate("https://abc.com/file.jpg"));
// 文件未找到,则将返回 -307756800 ( 1/04/1960)
$ret = -(3562 *24*60*60); // 1/04/1960 3562= 从 1/01/1970 到 1/04/1960 的秒数

$ch = curl_init($filePath);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 尝试获取文件修改日期。
curl_setopt($ch, CURLOPT_FILETIME, true);
$result = curl_exec($ch);
if($result===false){
die(curl_error($ch));
return $ret;
}

$ret = curl_getinfo($ch, CURLINFO_FILETIME);
curl_close($ch);

return $ret;
}
13
erelsgl at gmail dot com
14 年前
更便宜、更脏的缓存代码方法

<?php
$cache_file
= 'URI to cache file';
$cache_life = '120'; // 缓存时间,以秒为单位

$filemtime = @filemtime($cache_file); // 如果文件不存在,则返回 FALSE
if (!$filemtime or (time() - $filemtime >= $cache_life)){
ob_start();
resource_consuming_function();
file_put_contents($cache_file,ob_get_flush());
}else{
readfile($cache_file);
}
?>
12
myselfasunder at gmail dot XYZ dot com
13 年前
由于 filemtime() 在 Windows 下调用 Windows 的 stat() 函数,而 stat() 函数实现了 DST(根据此错误:http://bugs.php.net/bug.php?id=40568),因此 filemtime() 在 Windows 下存在一个根深蒂固的问题。文件的 DST 检测会受到当前系统当前时间是否处于 DST 的影响。

这是针对最令人讨厌的 bug 的修复方法

<?php
function GetCorrectMTime($filePath)
{

$time = filemtime($filePath);

$isDST = (date('I', $time) == 1);
$systemDST = (date('I') == 1);

$adjustment = 0;

if(
$isDST == false && $systemDST == true)
$adjustment = 3600;

else if(
$isDST == true && $systemDST == false)
$adjustment = -3600;

else
$adjustment = 0;

return (
$time + $adjustment);
}
?>

Dustin Oprea
4
Anonymous
19 年前
下面的一条评论指出

"当使用此函数获取目录的修改日期时,
它将返回该目录中最后修改的文件的日期。"

这并不(一定)正确,目录的修改时间将是该目录中最后创建的文件的时间(而不是其子目录中的文件)。
3
adam at roomvoter dot com
20 年前
前面允许您删除所有超过 2 周的旧文件的代码片段使用了函数 (filemtime) - 它检查文件的原始创建日期(与文件系统无关)。您可能需要使用 filectime() - 它查看文件在您的文件系统中最后修改的时间。

if (is_dir("$path") )
{
$handle=opendir($path);
while (false!==($file = readdir($handle))) {
if ($file != "." && $file != "..") {
$Diff = (time() - filectime("$path/$file"))/60/60/24;
if ($Diff > 14) unlink("$path/$file");

}
}
closedir($handle);
}
6
_michael
14 年前
在 Windows 上测试时,我注意到 filemtime 的精度只有 1 秒。

因此,如果您使用 clearstatcache() 和 filemtime() 检查文件是否已修改,它可能无法检测到更改。修改只需要发生在不到 1 秒的时间内。

(我在 Windows XP 上的 Apache 中遇到了这个问题。)
7
notepad at codewalkers dot com
19 年前
我需要能够获取远程网站上图像的修改时间。以下是 Joe Ferris 帮助下得到的解决方案。

<?php

function filemtime_remote($uri)
{
$uri = parse_url($uri);
$handle = @fsockopen($uri['host'],80);
if(!
$handle)
return
0;

fputs($handle,"GET $uri[path] HTTP/1.1\r\nHost: $uri[host]\r\n\r\n");
$result = 0;
while(!
feof($handle))
{
$line = fgets($handle,1024);
if(!
trim($line))
break;

$col = strpos($line,':');
if(
$col !== false)
{
$header = trim(substr($line,0,$col));
$value = trim(substr($line,$col+1));
if(
strtolower($header) == 'last-modified')
{
$result = strtotime($value);
break;
}
}
}
fclose($handle);
return
$result;
}
// echo filemtime_remote('http://www.somesite.com/someimage.jpg');

?>
4
wookie at at no-way dot org
20 年前
另一个便捷工具,用于获取目录中文件的最新修改时间。 如果你将 $doRecursive 参数设置为 true,它甚至可以递归目录。 基于我在这个网站上看到的某个文件/目录列表函数。 ;)

function mostRecentModifiedFileTime($dirName,$doRecursive) {
$d = dir($dirName);
$lastModified = 0;
while($entry = $d->read()) {
if ($entry != "." && $entry != "..") {
if (!is_dir($dirName."/".$entry)) {
$currentModified = filemtime($dirName."/".$entry);
} else if ($doRecursive && is_dir($dirName."/".$entry)) {
$currentModified = mostRecentModifiedFileTime($dirName."/".$entry,true);
}
if ($currentModified > $lastModified){
$lastModified = $currentModified;
}
}
}
$d->close();
return $lastModified;
}
3
Will Davies Vasconcelos
13 年前
这是一个方便的脚本,用于创建包含文件名和文件在给定文件夹中插入日期的 csv 文件

<?php
header
("Pragma: public");
header("Cache-Control: private");
header("Content-Type: text/csv");
header("Content-Disposition: attachment; filename=age-of-files.csv");

$result = array();
$handle = opendir(".");
while (
$datei = readdir($handle))
{
if ((
$datei != '.') && ($datei != '..'))
{
$file = "./".$datei;
if (!
is_dir($file))
$result[] = $file;
}
}
closedir($handle);
foreach(
$result as $r)
if (
file_exists($r))
echo
substr($r,2).",".date ("m/d/Y", filemtime($r))."\r\n";
?>
2
Benan Tumkaya (benantumkaya at yahoo)
18 年前
这是一个小巧但实用的脚本,你可以用它来查找服务器中哪些文件是在你指定的日期/时间之后修改的。 此脚本将递归遍历指定目录中的所有文件夹,并回显修改后的文件以及最后修改的日期/时间...

// 从这里开始
// 在这里放置要搜索的目录。 如果要搜索整个域,请放置 /
$dir='/';

// 将要比较的日期放置在以下格式中:YYYY-mm-dd hh:mm:ss
$comparedatestr="2006-08-12 00:00:00";
$comparedate=strtotime($comparedatestr);

// 我在这里运行函数来开始搜索。
directory_tree($dir,$comparedate);

// 这是执行搜索的函数...
function directory_tree($address,$comparedate){

@$dir = opendir($address);

if(!$dir){ return 0; }
while($entry = readdir($dir)){
if(is_dir("$address/$entry") && ($entry != ".." && $entry != ".")){
directory_tree("$address/$entry",$comparedate);
}
else {

if($entry != ".." && $entry != ".") {

$fulldir=$address.'/'.$entry;
$last_modified = filemtime($fulldir);
$last_modified_str= date("Y-m-d h:i:s", $last_modified);

if($comparedate < $last_modified) {
echo $fulldir.'=>'.$last_modified_str;
echo "<BR>";
}

}

}

}

}
2
nieprzeklinaj at gmail dot com
11 年前
这是一个用于智能缓存覆盖的便捷小函数 :)
<?php
function img($src, $alt='', $attr='')
{
if(
file_exists($src))
{
$lmod = filemtime($src);
echo
'<img src="'.$src.'?lmod='.$lmod.'" alt="'.$alt.'" '.$attr.' />';
}
}
?>
2
jay at fudge dot org
25 年前
如果你想要这个功能在父网页上,你应该使用 getlastmod()
例如
<?php echo "Last modified: ".date( "F d Y H:i:s.", getlastmod() ); ?>
在包含的页面中... 例如,作为所有页面的通用页脚包含
2
Anonymous
14 年前
请注意,下面人们提供的用于获取目录中特定时间之后修改的文件的许多函数在 Windows 操作系统上不会获取所有文件。

如果你将任何文件复制并粘贴到文件夹中或从另一个文件夹复制到文件夹中(例如可能使用的但不会立即修改的图像),这些复制文件的修改时间不会更新,只有创建时间会更新。

你需要使用 filectime 与 filemtime 来确保你获取到未修改但显然是新文件的复制文件。
2
Don
9 年前
要查找目录中最旧的文件
$directory= "C:\\";

$smallest_time=INF;

$oldest_file='';

if ($handle = opendir($directory)) {

while (false !== ($file = readdir($handle))) {

$time=filemtime($directory.'/'.$file);

if (is_file($directory.'/'.$file)) {

if ($time < $smallest_time) {
$oldest_file = $file;
$smallest_time = $time;
}
}
}
closedir($handle);
}

echo $oldest_file;
3
csnyder at chxo dot com
18 年前
如果 PHP 的整数类型在你的系统上只有 32 位,则 filemtime() 在处理超过 2GB 的文件时会失败,并出现警告“stat 失败”。 所有与 stat() 相关的命令都会出现相同的行为。

作为解决方法,你可以调用系统的 stat 命令来获取文件的修改时间

在 FreeBSD 上
$mtime = exec ('stat -f %m '. escapeshellarg ($path));

在 Linux 上
$mtime = exec ('stat -c %Y '. escapeshellarg ($path));

感谢“mpb dot mail at gmail dot com”在 stat() 上的类似评论。
1
info at daniel-marschall dot de
15 年前
确定目录中最新的文件的 timestamp 可能很有用。(例如,如果你想知道项目最后一次更改是什么时候)。

以下函数可以帮助你

<?php

function getAllFiles($directory, $recursive = true) {
$result = array();
$handle = opendir($directory);
while (
$datei = readdir($handle))
{
if ((
$datei != '.') && ($datei != '..'))
{
$file = $directory.$datei;
if (
is_dir($file)) {
if (
$recursive) {
$result = array_merge($result, getAllFiles($file.'/'));
}
} else {
$result[] = $file;
}
}
}
closedir($handle);
return
$result;
}

function
getHighestFileTimestamp($directory, $recursive = true) {
$allFiles = getAllFiles($directory, $recursive);
$highestKnown = 0;
foreach (
$allFiles as $val) {
$currentValue = filemtime($val);
if (
$currentValue > $highestKnown) $highestKnown = $currentValue;
}
return
$highestKnown;
}

// 使用示例

echo '最新文件的时间戳:<br>';
echo
date('Y-m-d H:i:s', getHighestFileTimestamp('../'));

?>
1
dma05 at web dot de
19 年前
关于 "notepad at codewalkers dot com" 的代码

这段代码很简洁,但我只想指出,在 HTTP 请求中使用 "HEAD" 方法而不是 "GET" 方法可能更可取,因为这样不会下载整个资源...

http/1.1 定义片段
第 "9.4 HEAD" 节

HEAD 方法与 GET 方法相同,除了服务器在响应中 **不应** 返回消息体。HEAD 请求的响应中包含的 HTTP 头部元信息 **应** 与 GET 请求响应中发送的信息相同。此方法可用于获取有关请求所隐含的实体的元信息,而无需传输实体体本身。此方法通常用于测试超文本链接的有效性、可访问性和最近修改。[...]
--- 片段结束 ---

代码将变成...

--- 片段 ---
fputs($handle,"HEAD $uri[path] HTTP/1.1\r\nHost: $uri[host]\r\n\r\n");
--- 片段结束 ---

致敬,Magnus
1
contacto at hardcode dot com dot ar
14 年前
在处理 SWF 文件(Flash 动画)时,有一个不错的方法可以避免浏览器缓存。我以前是手动操作,然后使用随机数,但对于大型动画在线工作时,这很枯燥,因为服务器总是下载整个动画,即使没有变化。
但是...

这将解决问题

base.swf?rand=<?php echo filemtime("base.swf") ?>

<embed src="base.swf?rand=<?php echo filemtime("base.swf") ?>" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="1680" height="1050">
1
tobias
10 年前
提到的示例

$filename = 'somefile.txt';
if (file_exists($filename)) {
echo "$filename 最后修改时间:: " . date ("F d Y H:i:s.", filemtime($filename));
}

有效,但从通过 PHP 提供静态文件的性能角度来看,它并不理想,因为它需要执行两个文件系统操作 (file_exists 和 filemtime)。更有效的方法是仅使用 filemtime,并使用以下方法节省 file_exists 的开销

$filename = 'somefile.txt';
$fmtime = filemtime($filename);
if (!$fmtime) {
echo "$filename 最后修改时间:: " . date ("F d Y H:i:s.", $fmtime);
}
1
gerardj at home dot com
25 年前
如果将以上代码放在要显示日期戳的每个页面上,它就可以正常工作。我发现,如果在包含或引入的文件中放置类似 filemtime(__FILE__) 的引用,则将返回继承文件的时间,而不是执行继承操作的文件的时间。
0
Steve GS
4 年前
如果文件不在执行脚本所在的目录中,除非使用 $_SERVER,否则将会导致失败。这是因为,与 file_exists() 一样,该命令在文件系统上起作用,而不是通过 HTTP。因此,以下代码将无法正常工作(并且可能会显示警告)

echo '<img src="' . $home_url . '/images/image.jpg?v=' . filemtime ($home_url . '/images/image.jpg') . '" />';

但以下代码可以

echo '<img src="' . $home_url . '/images/image.jpg?v=' . filemtime ($_SERVER['DOCUMENT_ROOT'] . '/images/image.jpg') . '" />';

上面的第二段代码将确保任何更新的图像都能够替换其前身,而不会强制浏览器在每次访问时都重新加载图像。
0
arkadia81 at gmail dot com
10 年前
对 "tobias" 帖子的一点修正

而不是
$filename = 'somefile.txt';
$fmtime = filemtime($filename);
if (!$fmtime) {
echo "$filename 最后修改时间:: " . date ("F d Y H:i:s.", $fmtime);
}

它应该是这样的
$filename = 'somefile.txt';
$fmtime = filemtime($filename);
if ($fmtime != false) {
echo "$filename 最后修改时间:: " . date ("F d Y H:i:s.", $fmtime);
}

filemtime() 在失败时返回 false,因此在第一个示例中,它将永远不会显示修改日期。
0
james dot schafer at gotalk dot net dot au
14 年前
在 Windows 系统上,filectime() 返回创建时间。要查找修改时间,请使用 fileatime() 或 filemtime()。
-1
Nilo
14 年前
一种廉价且肮脏的缓存代码方式

<?php
$cache_file
= '缓存文件 URI';
$cache_life = '120'; // 缓存时间,以秒为单位

if (!file_exists($cache_file) or (time() - filemtime($cache_file) >= $cache_life)){
ob_start();
resource_consuming_function();
file_put_contents($cache_file,ob_get_flush());
}else{
readfile($cache_file);
}
?>
-1
son9ne at gmail dot com
10 年前
如果确实使用
<?php
$filename
= 'somefile.txt';
$fmtime = filemtime($filename);
if (!
$fmtime) {
echo
"$filename 最后修改时间:: " . date ("F d Y H:i:s.", $fmtime);
}
?>

请注意,它会抛出一个警告,如文档中所述。虽然 tobias 为生产环境提出了一个很好的观点,但当错误报告关闭时,这可以提高您使用 `file_exists` 的性能。但是,如果错误报告已打开并且它正在写入日志...情况并非如此。显然,这因服务器规格和错误日志的大小而异。在大多数情况下,使用 `file_exists` 方法仍然是理想的选择。
-2
dagger80
14 年前
同样,在 32 位系统上,filemtime() 也不适用于修改时间设置为 2038 年 1 月之后的日期的文件。这是 Unix 秒的可怕的 time_t 溢出错误。

在 Windows 上,您可以将系统时间设置为任意将来的日期,并且您创建或编辑的任何新文件都会自动更改为该将来的日期。

如果出于某种原因不允许使用 exec,并且如果您可以通过 Web URL 访问文件(例如 http://localhost/yourfile.txt),另一个解决方法是从 HTTP 头部获取 Last-Modified 时间(例如 get_headers(url)),并将其解析为 DateTime 对象。

我已经测试过,它适用于 2050 年和 3012 年这样的年份。
To Top