请注意,当 PHP 由 f.e. apache 或 nginx 调用,而不是直接从命令行调用时,touch() 不会添加调用脚本的位置,因此提供的文件名必须包含一个绝对路径。
如果脚本从 /home/user/www 启动,则不会轻触 "/home/user/www/somefile"
<?php
touch( 'somefile' );
?>
但如下操作会轻触
<?php
touch( __DIR__ . '/somefile' );
?>
(PHP 4,PHP 5,PHP 7,PHP 8)
touch — 设置文件的访问和修改时间
尝试将 filename
参数中指定的文件的访问和修改时间设置为 mtime
中给定的值。请注意,无论参数有多少,访问时间始终都会被修改。
如果该文件不存在,则会创建该文件。
版本 | 描述 |
---|---|
8.0.0 |
mtime 和 atime 现在可以为 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 '成功轻触了文件';
}
?>
注意:
请注意,时间分辨率可能因文件系统而异。
请注意,当 PHP 由 f.e. apache 或 nginx 调用,而不是直接从命令行调用时,touch() 不会添加调用脚本的位置,因此提供的文件名必须包含一个绝对路径。
如果脚本从 /home/user/www 启动,则不会轻触 "/home/user/www/somefile"
<?php
touch( 'somefile' );
?>
但如下操作会轻触
<?php
touch( __DIR__ . '/somefile' );
?>
更新访问时间,但不更新修改时间
Unix 命令:touch -a filename
PHP:touch(filename, date('U', filemtime(filename)), time())
我一直在尝试使用 PHP5 的 touch() 将 filemtime 设为将来。
touch $time 似乎有个大约 1000000 秒(约 11 天)的将来限制。超出此限制,它会还原为先前的 $time。
这没什么道理,但我可以为您节省几个小时的时间。
$time = time()+1500000;
touch($cachedfile,$time);
至少在 Linux 中,touch 本身不会更改符号链接的时间,但它会更改其指向的文件/目录的时间。解决此问题的唯一方法是取消链接符号链接,然后重新创建它。
发现这一点花了点时间。操作系统本身没有提供可用来完成此操作的方法。许多人想知道为什么有人想要这样做。我在 Web 树的内部使用符号链接来指向 Web 树外部的文件。一段时间后,我希望这些符号链接失效,这样文件便无法成功热链接到。
如果要触摸不属于自己的文件,操作会变得容易得多。
<?php
function touchFile($file) {
fclose(fopen($file, 'a'));
}
?>
更新其中一些文件时,我需要使用它来触摸 /etc/cron.d 目录。我知道文档中说这不是必需的,但为了让我的更改能够快速得到采纳,我发现需要这样做。
我也遇到了权限错误,并且我发现使用 chmod 777 /etc/cron.d 可以解决此问题。
因此,您应该能够对具有开放写入权限的目录使用 PHP touch 函数。
当然,这不是最安全的方式,但是在我们的应用程序中,该文件夹的安全性不是特别重要。
我已经完成了一个小测试来检查哪个函数创建新文件的速度更快。
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 快两倍。
如果你要删除(取消链接)你
不拥有,仅仅为了修改
文件中的修改时间,那你最好 chown() 该文件
恢复到其原始所有权,并在完成后
将其 chmod() 恢复为正确的权限。否则
你几乎肯定会有所破坏。此外列出的
用于 touch() 你不拥有的文件的代码应该
将文件创建的时间设置回其原始时间,如果
所需要的是仅仅修改修改时间。
另外,列出的代码如果出现 i/o
错误(例如磁盘已满或目录中文件太多),将会破坏事物。
以下是该代码应当编写的格式
首先而不是最后创建新文件,使用不同的
诸如 $file.tmp. 的名称。
读取旧文件的拥有权、权限和创建日期。
将新文件的权限和创建日期设置与旧文件相同。
将新文件的名称重命名为旧文件的名称。
将新文件的 chown() 设置为拥有要替换的文件的用户。
如果你
从未学习过编程 101,请谨慎添加文档。
在目录中修改日期的唯一方法是通过 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");
}
}
?>
一个简洁的小脚本,它将为你提供某个文件夹中某个日期之后所有已修改文件列表
$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;
}
我发现设置一个负*mtime*会删除文件。下面的代码始终删除$path中的文件,而$touch返回true。
<?php
$path = '/folder/file';
$timestamp = -1;
$touch = touch($path, $timestamp);
?>
运行PHP 7.4.5
更好的解释
针对存储在变量 $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()!
以下是一种变通办法,可使 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 需要具有对要编辑的文件所在文件夹的写访问权限,但这样很容易实现。
在命令行上的 unix 中,你可以编辑不属于自己的文件 - 但正如此页面中的其他评论中所述 - PHP 的内置触摸功能无效。
(在 unix 中)一个简单的替代方法是
<?php
function touch_it_good($filename)
{
exec("touch {$filename}");
}
?>
之前的评论引用了一段代码示例,显示 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
?>