是什么导致PHP锁定文件

时间:2012-10-02 13:33:46

标签: 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 line 52

第52行是rmdir($dir);

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

执行iisreset暂时解决问题。我正在编写一个静态站点生成函数,但每隔几分钟就会出现这个问题。

2 个答案:

答案 0 :(得分:0)

您的脚本chdir()是否可能编辑到目录?在Windows下,您无法删除任何正在运行的进程的当前目录。有时您可能会收到奇怪的消息(例如“目录不为空”),而真正的原因是有进程以该目录作为当前进程运行。

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

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

答案 1 :(得分:-2)

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

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

此功能将删除文件夹中的所有内容,然后将其删除。