是什么导致PHP锁定文件

是什么导致PHP锁定文件,php,windows,iis,Php,Windows,Iis,在我的服务器上,脚本创建的脚本和缓存文件偶尔会被PHP进程锁定。一旦锁定,它们就无法通过网络共享、服务器本地或PHP本身进行访问。刷新页面会导致访问被拒绝错误: Warning: rmdir(C:\inetpub\wwwroot\mdblog\public\..\cache\posts\2012) [function.rmdir]: Directory not empty in C:\inetpub\wwwroot\mdblog\public\system\Filesystem.php on

在我的服务器上,脚本创建的脚本和缓存文件偶尔会被PHP进程锁定。一旦锁定,它们就无法通过网络共享、服务器本地或PHP本身进行访问。刷新页面会导致访问被拒绝错误:

Warning:  rmdir(C:\inetpub\wwwroot\mdblog\public\..\cache\posts\2012) 
[function.rmdir]: Directory not empty in
C:\inetpub\wwwroot\mdblog\public\system\Filesystem.php on line 52
第52行是
rmdir($dir)

在“大量”磁盘操作(连续快速刷新页面、一次删除多个文件等)之后,此问题更为普遍。它是一个Windows Server 2008 R2服务器,具有IIS7和PHP5.3.13(使用FastCGI),运行在虚拟机服务器上,无病毒扫描程序,使用Web平台安装程序安装PHP


执行
iisreset
可暂时修复该问题。但是,我正在编写一个静态站点生成函数,这会导致每隔几分钟出现一次此问题。

正如错误所说,文件夹不是空的,因此无法擦除。可能是因为没有删除所有临时文件。尝试实现并使用递归函数

function rrmdir($dir) {
    foreach(glob($dir . '/*') as $file) {
        if(is_dir($file))
            rrmdir($file);
        else
            unlink($file);
    }
    rmdir($dir);
}

此函数将删除文件夹中的所有内容,然后再将其删除。

是否可能将脚本chdir()插入目录?在Windows下,您不能删除任何正在运行的进程的当前目录。有时,您可能会收到奇怪的消息(如“directory not empty”),而真正的原因是,有些进程将该目录作为当前目录运行

我的想法是IIS使PHP进程保持活动状态(因为在Windows下,启动新进程是一项繁重的操作),因此池中未使用的进程会阻止您删除这些目录。通过重新启动IIS,您可以杀死池中的所有进程,从而使删除成为可能


尝试将chdir()添加到PHP脚本末尾的默认目录中,看看它是否有效。

谢谢,但这不是问题所在,我的代码工作正常,问题与代码无关(在该服务器上的所有PHP项目上都会时断时续地出现)。您还没有阅读该问题。OP表示文件已锁定,无法访问、编辑或删除。这是问题,不是为什么会发生错误。好吧,对不起。关掉wincache,如果你有它,可能对你有用。一些使用它的IIS安装有这样的问题。有趣的问题。您可能也想试试运气。最好避免chdir()-ing到任何目录。不要使用
chdir()
,但我同意关于应用程序池的一般评论。