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

Und*_*ble 5 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);
}
?>
Run Code Online (Sandbox Code Playgroud)

现在我的问题是如何定义being_accessed?我知道在PHP中可能没有语言功能直接对此做.我正在考虑使用像last_access_time(可能?)和flock(但这只在flock访问应用程序使用文件的那些条件下)这些部分的组合

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

Mar*_*ski 6

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