1

可能重复:
自动从网络服务器中删除文件

我正在将一些 XML 内容记录到一个文本文件中file_put_contents(),以防我需要它进行调试。

如何在一定时间后删除此文件?

.htaccess在日志文件夹中有一个限制,但我宁愿不要将信息(会有客户的地址等)长时间留在网上。

4

6 回答 6

5

好吧,虽然同意其他人的观点,你使用了错误的工具来完成这项工作,但你的问题非常简单。所以你去:

  • 编写将从命令行运行的 PHP 脚本
  • 使用类似cron或 windows 计划任务的工具
  • 调用cron每分钟/五分钟/等

您的脚本将非常简单:

<?php
   $dh = opendir(PATH_TO_DIRECTORY);
   while( ($file = readdir($dh)) !== false ) {
      if( !preg_match('/^[.]/', $file) ) {  // do some sort of filtering on files
         $path = PATH_TO_DIRECTORY . DIRECTORY_SEPARATOR . $file;
         if( filemtime($path) < strtotime('-1 hour') ) {  // check how long it's been around
            unlink($path);  // remove it
         }
      }
   }

如果您在 Linux 中工作,您也可以使用find,但我看到 @Rawkode 在我写这篇文章时发布了这个,所以我会为您提供他对该解决方案的优雅答案。

于 2012-11-12T17:11:06.830 回答
4

您应该使用将尊重 php.ini 设置的 PHP error_log()函数。

error_log('Send to PHP error log');
error_log('Sent to my custom log', 3, "/var/tmp/my-errors.log");
于 2012-11-12T17:03:39.740 回答
3

您可以使用内置功能 – filectime– 来跟踪日志文件的创建日期,然后删除那些旧到可以删除的文件。

此代码搜索日志目录并删除 2 周前的日志。

$logs = opendir('logs');

while (($log = readdir($logs)) !== false)
{
    if ($log == '.' || $log == '..')
        continue;

    if (filectime('logs/'.$log) <= time() - 14 * 24 * 60 * 60)
    {
        unlink('logs/'.$log);
    }
}

closedir($logs);
于 2012-11-12T17:08:39.070 回答
2

有两种方法可以解决:

  1. 如果您仅将日志写入一个文件,则可以使用以下方式清空该文件:

    <?php file_put_contents($logpath, "");
    
  2. 如果你生成很多文件,你可以像这样编写清理函数:

    <?php
    $logpath = "/tmp/path/to/log/";
    $dirh = opendir($logpath);
    while (($file = readdir($dh)) !== false) {
        if(in_array($file, array('.', '..'))) continue;
        unlink($logpath . $file);
    }
    closedir($dirh);        
    
于 2012-11-12T17:10:16.577 回答
2

您应该更好地处理您的日志记录,但要回答您的问题,我会使用 *nixfind命令。

find /path/to/files* -mtime +5 -delete

这将删除所有五天内未修改的文件。根据自己的需要进行调整。

于 2012-11-12T17:05:05.843 回答
0

您可以设置服务器计划任务(在 *nix 系统下最常见的 Cron 作业)定期运行并删除左侧的日志文件。任务是执行一个 PHP 代码来完成这项工作。

请参阅Cron 作业概述w

于 2012-11-12T17:06:30.373 回答