0

有没有办法检查一个文件是否被另一个进程从 php 脚本访问或修改。我曾尝试使用 filemtime()、fileatime() 和 filectime() 函数,但我有一个循环中的脚本,它正在不断检查,但似乎一旦脚本被执行,它只会从第一次开始文件已检查.. 一个示例是将文件上传到 FTP 或 SMB 共享,我在下面尝试了此操作

while(1==1)
{
  $LastMod = filemtime("file");
  if(($LastMod +60) > time())
  {
    echo "file in use please wait... last modified : $LastMod";
    sleep(10);
  }else{
    process file
  }
}

我知道文件在不断变化,但 $LastMod 变量没有更新,但结束进程并再次执行将从文件中获取新的 $LastMod 但每次在循环中检查文件时 dosnt 似乎都会更新

我也尝试过查看 filesize() 但得到相同的症状我也查看了 flock() 但由于文件是在 PHP 之外创建或修改的,所以我看不出这是如何工作的。

如果有人有任何解决方案请告诉我

感谢 Vip32

PS。使用 PHP 处理文件需要与 mysql 交互和查询外部网站

4

2 回答 2

3

文件元数据函数都处理stat()输出,缓存其数据,因为 stat() 调用是一个相对昂贵的函数。您可以清空该缓存以强制 stat() 获取新数据clearstatcache()

还有其他机制允许您监视文件更改。与其在 PHP 中执行循环并重复 stat()ing,不如考虑使用外部监控应用程序/脚本,该应用程序/脚本可以挂钩到操作系统提供的机制,并在文件确实发生更改时按需调用您的 PHP 脚本。

于 2011-07-15T21:45:29.173 回答
0

添加clearstatcache();到您的循环中:

while(true)
{
  $LastMod = filemtime("file");
  clearstatcache();
  if(($LastMod +60) > time())
  {
    echo "file in use please wait... last modified : $LastMod";
    sleep(10);
  }else{
    process file
  }
}
于 2011-07-15T21:46:22.447 回答