touch

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

touch设置文件的访问和修改时间

描述

touch(string $filename, ?int $mtime = null, ?int $atime = null): bool

尝试将 filename 参数中指定的文件的访问和修改时间设置为 mtime 中给定的值。请注意,无论参数有多少,访问时间始终都会被修改。

如果该文件不存在,则会创建该文件。

参数

filename

要触发的文件的文件名。

mtime

触发的事件。如果 mtimenull,将使用当前系统 time()

atime

如果不为 null,则所给 filename 的访问时间将被设置为 atime 的值。否则,它将被设置为传递给 mtime 参数的值。如果两者都是 null,则使用当前系统时间。

返回值

成功时返回 true,失败时返回 false

更新日志

版本 描述
8.0.0 mtimeatime 现在可以为 null。

示例

示例 #1 touch() 示例

<?php
if (touch($filename)) {
echo
$filename . ' 修复时间已被修改为现在的事件';
} else {
echo
' 抱歉,无法修改 . $filename 的修订时间';
}
?>

示例 #2 touch() 使用 mtime 参数

<?php
// 这是轻触时间,我们将其设置为过去一小时。
$time = time() - 3600;

// 轻触文件
if (!touch('some_file.txt', $time)) {
echo
'糟糕,有些地方出了差错...';
} else {
echo
'成功轻触了文件';
}
?>

注意

注意:

请注意,时间分辨率可能因文件系统而异。

添加注意

用户贡献的注释 18 个注释

anon
10 年前
请注意,当 PHP 由 f.e. apache 或 nginx 调用,而不是直接从命令行调用时,touch() 不会添加调用脚本的位置,因此提供的文件名必须包含一个绝对路径。

如果脚本从 /home/user/www 启动,则不会轻触 "/home/user/www/somefile"

<?php
touch
( 'somefile' );
?>

但如下操作会轻触

<?php
touch
( __DIR__ . '/somefile' );
?>
Charles Belov
18 年前
更新访问时间,但不更新修改时间

Unix 命令:touch -a filename

PHP:touch(filename, date('U', filemtime(filename)), time())
Jeff
16 年前
我一直在尝试使用 PHP5 的 touch() 将 filemtime 设为将来。

touch $time 似乎有个大约 1000000 秒(约 11 天)的将来限制。超出此限制,它会还原为先前的 $time。

这没什么道理,但我可以为您节省几个小时的时间。

$time = time()+1500000;
touch($cachedfile,$time);
mrgrier at yahoo dot com
15 年前
至少在 Linux 中,touch 本身不会更改符号链接的时间,但它会更改其指向的文件/目录的时间。解决此问题的唯一方法是取消链接符号链接,然后重新创建它。

发现这一点花了点时间。操作系统本身没有提供可用来完成此操作的方法。许多人想知道为什么有人想要这样做。我在 Web 树的内部使用符号链接来指向 Web 树外部的文件。一段时间后,我希望这些符号链接失效,这样文件便无法成功热链接到。
ernst at cron-it dot de
14 年前
如果要触摸不属于自己的文件,操作会变得容易得多。

<?php
function touchFile($file) {
fclose(fopen($file, 'a'));
}
?>
chris dot dallaire at csquaredsystems dot com
14 年前
更新其中一些文件时,我需要使用它来触摸 /etc/cron.d 目录。我知道文档中说这不是必需的,但为了让我的更改能够快速得到采纳,我发现需要这样做。

我也遇到了权限错误,并且我发现使用 chmod 777 /etc/cron.d 可以解决此问题。

因此,您应该能够对具有开放写入权限的目录使用 PHP touch 函数。

当然,这不是最安全的方式,但是在我们的应用程序中,该文件夹的安全性不是特别重要。
bosslog at gmail dot com
13 年前
我已经完成了一个小测试来检查哪个函数创建新文件的速度更快。

file_put_contents 与 touch

<?php
for($i = 0; $i < 100; $i++)
{
file_put_contents('dir/file'.$i, '');
}
?>
平均时间:0.1145 秒

<?php
for($i = 0; $i < 100; $i++)
{
touch('dir/file'.$i);
}
?>
平均时间:0.2322 秒

因此,file_put_contents 的速度比 touch 快两倍。
ddalex 在 gmail 点 com
15 年前
事实上,Glen 说得对,如果 PHP 不是文件的当前所有者,PHP 将不会接触该文件,即使目录和文件对 PHP 用户具有可写权限。
spam 在网站管理员指南点 com
18 年前
如果你要删除(取消链接)你
不拥有,仅仅为了修改
文件中的修改时间,那你最好 chown() 该文件
恢复到其原始所有权,并在完成后
将其 chmod() 恢复为正确的权限。否则
你几乎肯定会有所破坏。此外列出的
用于 touch() 你不拥有的文件的代码应该
将文件创建的时间设置回其原始时间,如果
所需要的是仅仅修改修改时间。
另外,列出的代码如果出现 i/o
错误(例如磁盘已满或目录中文件太多),将会破坏事物。
以下是该代码应当编写的格式

首先而不是最后创建新文件,使用不同的
诸如 $file.tmp. 的名称。
读取旧文件的拥有权、权限和创建日期。
将新文件的权限和创建日期设置与旧文件相同。
将新文件的名称重命名为旧文件的名称。
将新文件的 chown() 设置为拥有要替换的文件的用户。

如果你
从未学习过编程 101,请谨慎添加文档。
info 在 ar chiwumrocka dot art dot pl
15 年前
在目录中修改日期的唯一方法是通过 touch() 创建文件,然后通过 unlink() 删除文件

<?php
$dir
= 'temp';
$files1 = scandir($dir);

$files1 = array_slice($files1, 2);

foreach (
$files1 as $key => $val)
{
if (!
is_dir($val)) continue;
if (!
touch($val))
{
touch($val . "/plik.txt");
unlink($val . "/plik.txt");
}
}
?>
rf_public at yahoo dot co dot uk
19年前
注意:触摸非你所有文件的脚本将更改其所有者,因此确保权限正确,否则你可能会失去对其的访问权限
feathern at yahoo dot com
22年前
一个简洁的小脚本,它将为你提供某个文件夹中某个日期之后所有已修改文件列表

$filelist = Array();
$filelist = list_dir("d:\\my_folder");
for($i=0;$i<count($filelist);$i++){
$test = Array();
$test = explode("/",date("m/d/Y",filemtime($filelist[$i])));
// 比下面列出的文件示例更晚
//06/17/2002
if(($test[2] > 2001) && ($test[1] > 16) && ($test[0] > 5)){
echo $filelist[$i]."\r\n";
}
clearstatcache();
}
function list_dir($dn){
if($dn[strlen($dn)-1] != '\\') $dn.='\\';
static $ra = array();
$handle = opendir($dn);
while($fn = readdir($handle)){
if($fn == '.' || $fn == '..') continue;
if(is_dir($dn.$fn)) list_dir($dn.$fn.'\\');
else $ra[] = $dn.$fn;
}
closedir($handle);
return $ra;
}
picek dot jaroslav at protonmail dot com
6个月前
我发现设置一个负*mtime*会删除文件。下面的代码始终删除$path中的文件,而$touch返回true。

<?php
$path
= '/folder/file';
$timestamp = -1;

$touch = touch($path, $timestamp);
?>

运行PHP 7.4.5
centurianii at yahoo dot co dot uk
6 年前
更好的解释

针对存储在变量 $access 和 $modified 中的文件 $file 和 UNIX 时间

- 仅更改访问时间
\touch($file, \filemtime($file), $access);

- 仅更改修改时间
\touch($file, $modified, \fileatime($file));

- 更改访问时间和修改时间
\touch($file, $modified, $access);

查看结果

//使用存储在自定义文件夹中的会话 Cookie
$file = '/var/www/test_com/session/sess_qfn587cudfpgsijm1bs4d81s75';
echo 'sess_qfn587cudfpgsijm1bs4d81s75 的统计信息<br/>';
\clearstatcache();
echo '访问时间:'.\date("Y-m-d H:i:s", \fileatime($file)).'<br/>';
echo '修改时间:'.\date("Y-m-d H:i:s", \filemtime($file)).'<br/>';
echo '将访问时间更改为现在,修改时间为 1 小时后<br/>';
\touch($x, \filemtime($file)+3600, time());
\clearstatcache();
echo '访问时间:'.\date("Y-m-d H:i:s", \fileatime($file)).'<br/>';
echo '修改时间:'.\date("Y-m-d H:i:s", \filemtime($file)).'<br/>';

注意反复调用 clearstatcache()!
guy at forster design dot com
19年前
以下是一种变通办法,可使 PHP 用户编辑自己不拥有的文件

<?php

$target_file
= "/path/to/file/filename.txt"; //system filepath to your file
$file_content = implode("",file($target_file));
@
unlink($target_file);
if(
$savetofile = fopen($target_file, "w")) {
fputs($savetofile, $file_content);
fclose($savetofile);
}
$new_date = strtotime("23 April 2005"); // set the required date timestamp here
touch($target_file,$new_date);

?>

当然,PHP 需要具有对要编辑的文件所在文件夹的写访问权限,但这样很容易实现。
Glen
16 年前
在命令行上的 unix 中,你可以编辑不属于自己的文件 - 但正如此页面中的其他评论中所述 - PHP 的内置触摸功能无效。

(在 unix 中)一个简单的替代方法是

<?php

function touch_it_good($filename)
{
exec("touch {$filename}");
}
?>
Radon8472
16 年前
重要信息

touch() 用在目录上时,总返回 FALSE,并在 NTFS 和 FAT 文件系统(已在 winXP 上测试)上打印出“权限不足”。
csouth at xistins dot com
9 年前
之前的评论引用了一段代码示例,显示 file_put_contents() 创建文件比 touch 更快。我重新在 PHP 5.5.9 上运行了同一测试,这似乎不再是这种情况。

<?php
$startTime
= microtime(true);
for(
$i = 0; $i< 100000; $i++)
{
file_put_contents('dir/file'.$i, '');
unlink('dir/file'.$i);
}
echo
"时间: ".(microtime(true)-$startTime)."\n"; // 时间: 2.6902809143066

$startTime = microtime(true);
for(
$i = 0; $i < 100000; $i++)
{
touch('dir/file'.$i);
unlink('dir/file'.$i);
}
echo
"时间: ".(microtime(true)-$startTime)."\n"; // 时间: 2.3343770503998
?>
To Top