【问题标题】:How to perform filesystem operations in transaction with php?如何使用 php 在事务中执行文件系统操作?
【发布时间】:2013-02-27 11:30:45
【问题描述】:

我正在寻找使用带有事务支持的 php 来实现文件系统操作的方法。就像我在事务中执行移动、复制和删除等操作一样,如果其中一个失败,脚本需要恢复所有已经执行的操作。我有点无能为力,正在寻求指导如何实现它。如果存在可用的库或解决方案?如果问题听起来含糊不清,我深表歉意。

【问题讨论】:

  • 也许使用单例设计模式来创建一个对象的实例,该对象创建一个已处理和已完成的事件列表以及一个算法,该算法将是每个事件的反转(切换 FROM TO例如职位)。如果由于任何原因失败,则执行将撤消所做的所有更改的实例。

标签: php file filesystems


【解决方案1】:

最常见的模式是将所有内容复制到其他地方,对副本进行操作并在一切正常时替换原件。

有些事情告诉我 PHP 流包装器也可能对此有用。可以覆盖 'file://' 协议并在虚拟文件系统中运行(概念证明:https://github.com/Respect/Test#streamwrapper)。

【讨论】:

    【解决方案2】:

    文件系统 - 与数据库管理系统相比 - 不支持事务。然而,有些确实提供了实现交易所需的东西;那就是锁定和记录。日志不会成为您的问题,因为您也可以在 php 中完成,但您需要一个提供文件锁的文件系统。

    我建议你不要自己实现这样的东西——你可能会遇到很多问题。数据库人员在这里回顾了几十年的研究历史。

    但如果你必须这样做,你可以(首先)在 php.ini 中实现类似Two-phase locking 的东西。此外,您可以考虑使用command pattern,它有助于为您的回滚提供撤消功能。

    【讨论】:

      【解决方案3】:

      一种选择是考虑将文件存储为数据库中的 BLOB,而不是文件。这些将支持事务以及数据库的所有其他功能。

      可以在 ZFS 等高级文件系统上支持事务,但不能直接使用 PHP,并且 Linux 上默认不安装 ZFS。

      【讨论】:

        猜你喜欢
        • 2011-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-17
        • 2012-04-03
        • 2013-11-04
        • 2011-01-29
        相关资源
        最近更新 更多