我正在寻找一个我需要删除日志文件的解决方案,但是有可能在进行删除调用时访问它们。通过访问,我的意思是进程是读取或写入文件。在这种情况下,我需要跳过该文件而不是删除它。我的服务器也是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
的条件 - 由访问应用程序编辑)
任何建议/见解欢迎......
答案 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);
注意@避免在文件不可删除时出错,并且缺少结束标记(结束标记是常见错误的来源,应该避免)