如何在x-time之后自动删除子目录下的所有文件(假设在24小时之后) - 不使用来自服务器或pl的cronjob命令。你怎么能只使用PHP代码或只是访问页面而不点击某些内容并且命令自动运行。
答案 0 :(得分:15)
我的第一个回答对最后评论的回复。我打算编写代码示例,所以我创建了另一个答案,而不是再添加一个评论。
要删除具有自定义扩展名的文件,您必须实现代码:
<?php
$path = dirname(__FILE__).'/files';
if ($handle = opendir($path)) {
while (false !== ($file = readdir($handle))) {
if ((time()-filectime($path.'/'.$file)) < 86400) { // 86400 = 60*60*24
if (preg_match('/\.txt$/i', $file)) {
unlink($path.'/'.$file);
}
}
}
}
?>
评论:1。此示例使用正则表达式/\.txt$/i
,这意味着只会删除扩展名为txt
的文件。 '$'符号表示该文件名必须以字符串'.txt'结尾。标志'i'表示,该比较将不区分大小写。有关preg_match()功能的更多信息。
此外,您可以使用strripos()功能搜索具有特定扩展名的文件。这是代码片段:
<?php
$path = dirname(__FILE__).'/files';
if ($handle = opendir($path)) {
while (false !== ($file = readdir($handle))) {
if ((time()-filectime($path.'/'.$file)) < 86400) { // 86400 = 60*60*24
if (strripos($file, '.txt') !== false) {
unlink($path.'/'.$file);
}
}
}
}
?>
评论:这个例子似乎更明显。 strripos()
的结果也可以通过两个函数的组合来实现:strrpos(strtolower($file), '.txt')
,但是,恕我直言,在代码中使用较少的函数使其更具可读性和更小是一个很好的规则。请仔细阅读strripos()函数页面上的警告(返回值块)。
一个更重要的通知:如果您使用的是UNIX系统,由于文件权限,文件删除可能会失败。您可以查看有关chmod()功能的手册。
祝你好运。答案 1 :(得分:8)
您可以使用PHP核心函数filectime()和unlink()来检查文件创建时间并删除其文件/文件。
EDIT。 代码示例:
if ($handle = opendir('/path/to/files')) {
while (false !== ($file = readdir($handle))) {
if (filectime($file)< (time()-86400)) { // 86400 = 60*60*24
unlink($file);
}
}
}
答案 2 :(得分:1)
以下是使用GLOB的另一个示例,它将删除任何文件
$files = glob('path/to/your/files/*');
foreach($files as $file) { // iterate files
// if file creation time is more than 5 minutes
if ((time() - filectime($file)) > 3600) { // 86400 = 60*60*24
unlink($file);
}
}
或者如果您想要排除某些文件
$files = preg_grep('#\.txt#', glob('/path/to/your/files/*'), PREG_GREP_INVERT);
答案 3 :(得分:1)
在尝试使用这些示例后,我遇到了几个问题:
我更改了示例以使用filemtime并修复了比较,如下所示:
<?php
$path = dirname(__FILE__).'/files';
if ($handle = opendir($path)) {
while (false !== ($file = readdir($handle))) {
if ((time()-filemtime($path.'/'.$file)) > 86400) { // 86400 = 60*60*24
if (preg_match('/\.txt$/i', $file)) {
unlink($path.'/'.$file);
}
}
}
}
?>
答案 4 :(得分:0)
我使用shell AT命令,它就像一个cronjob
PHP:
exec("echo rm /somedir/somefile.ext|at now +24 hours");
答案 5 :(得分:0)
function deleteCachedData($hours=24)
{
$files = glob(ROOTDIR.DIRECTORY_SEPARATOR.'tmp'.DIRECTORY_SEPARATOR.'*.txt');
foreach($files as $file) {
if(is_file($file) && (time() - filectime($file)) > $hours*3600) {
unlink($file);
}
}
}
答案 6 :(得分:0)
$path = 'folder/subfolder/';
/* foreach (glob($path.'.txt') as $file) { */
foreach (glob($path.'*') as $file) {
if(time() - filectime($file) > 86400){
unlink($file);
}
}