如果当前未被访问,则删除文件

时间:2012-08-29 19:10:30

标签: php filesystems

我正在寻找一个我需要删除日志文件的解决方案,但是有可能在进行删除调用时访问它们。通过访问,我的意思是进程是读取或写入文件。在这种情况下,我需要跳过该文件而不是删除它。我的服务器也是Linux,PHP在Apache上运行。

我要找的是类似于(in pseudo-code)的东西:

<?php
$path = "path_to_log_file";
$log_file = "app.log"; 
if(!being_accessed($log_file))
{
  unlink($path.$log_file);
}
?>

现在我的问题是如何定义being_accessed?我知道在PHP中可能没有语言功能直接对此做。我正在考虑使用像last_access_time(可能?)和flock这样的部分的组合(但这仅适用于文件为flock的条件 - 由访问应用程序编辑)

任何建议/见解欢迎......

2 个答案:

答案 0 :(得分:6)

一般情况下,如果没有管理权限,您将无法找到它(并且能够运行lsof之类的工具来查看您的文件是否已列出。但是如果您的脚本在linux /上运行unix服务器(大多数托管服务商就是这种情况)然后你不需要打扰,因为文件系统会处理这个问题。例如,你有1GB文件,有人正在下载这个文件。你可以安全地删除它文件(使用unlink()或任何其他方式)事件,如果下载器刚启动并且不会干扰他的下载,因为文件系统知道文件已经打开(某些进程持有句柄)所以它只会标记它,让对其他人说invisible(因此,一旦您尝试列出文件夹内容,您将不再看到该文件,但如果您的文件足够大,您可以尝试检查可用磁盘空间(即使用df)看到它仍将被占用))但那些如何保持句柄仍然能够使用它。一旦所有进程关闭其句柄文件将是phy从媒体和磁盘空间中删除。所以只需要在需要时取消链接。如果您担心警告unlink可能会抛出(在Windows上可能是这种情况),那么只需使用@标记(@unlink())添加您的呼叫,以禁用此呼叫可能引发的任何警告运行

答案 1 :(得分:1)

您只需以这种方式更改代码(如果您重复这样做):

<?php
$path = "path_to_log_file";
$log_file = "app.log"; 
@unlink($path.$log_file);

注意@避免在文件不可删除时出错,并且缺少结束标记(结束标记是常见错误的来源,应该避免)