【问题标题】:Recursive directory delete while creating new files创建新文件时递归目录删除
【发布时间】:2013-02-21 14:35:30
【问题描述】:

所以我想创建一个删除文件夹及其内容的脚本,但在执行此操作时可能会创建新文件。做这个的最好方式是什么?

一些例子是 - 我们有“缓存”文件夹,我想删除整个缓存,但这样做时缓存文件夹中创建了更多文件,它永远不会为空,因此无法删除。

【问题讨论】:

    标签: php file caching recursion directory


    【解决方案1】:

    将目录移到其他位置(例如到/tmp)。然后删除它。移动是原子的且快速的(因为它只是文件系统上的一个指针更改,并且无论文件夹中的内容如何,​​都不会真正涉及繁重的磁盘 I/O)。

    为了更好地应对任何类型的问题,您应该创建一个这样的目录结构:

    /var/www/website/
        releases/
            1111/
            1112/
            1113/
        current_release/
    

    假设您的网站当前位于/var/www/website/releases/1113/。您的 apache 应该设置有 /var/www/website/current_release/ 的 DocumentRoot 符号链接到 /var/www/website/releases/1113

    当您需要清除缓存时,您应该部署一个新版本,例如/var/www/website/releases/1114。部署 ti 后,缓存目录为空,将 /var/www/website/current_release/ 上的符号链接翻转到新的发布目录。

    然后,Apache 将使用空缓存文件夹从新目录中提供文件。

    这是完成此类事情的唯一真正原子方式,除了让服务器离线(这通常不是清除缓存这样微不足道的事情的选择)。

    这将是解决问题的一种企业级解决方案,但它带来的额外好处是允许您轻松回滚生产服务器(只需将符号链接切换到以前的版本)。如果您非常关心这个问题,这似乎是过度设计,这是正确的方法。

    【讨论】:

    • 这是否意味着我可以移动它,如果在移动完成时创建文件,它将再次创建而不会出现问题
    • 移动完成时不会创建文件。但是让我再充实一下我的答案,因为这似乎很重要。
    • 非常感谢您的解决方案,但要明确我理解答案。我需要的是使用“重命名”,如重命名(“缓存”,“tmp/”)。比在 tmp 中清空它,然后执行相反的操作和 rename("tmp/", "cache")
    • 所以我错了,我看到了 symlink() 函数,但我也让 windows 它适用于 vista +,这会是个问题吗?
    猜你喜欢
    • 2012-06-12
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 2014-07-07
    相关资源
    最近更新 更多