代码之家  ›  专栏  ›  技术社区  ›  Evert

以原子方式创建文件的最佳方法

  •  1
  • Evert  · 技术社区  · 17 年前

    以原子方式创建新文件的“最佳实践”(在我看来)是打开一个临时文件(使用 tmpfile() ),然后将文件移动到其最终位置。

    但是,如果临时文件位于不同的装入点上,这将不能很好地工作,因为这将导致文件逐渐累积,并另外导致不必要的IO开销。

    是否有类似于tmpfile()的方法允许我指定装入点?我意识到这可能不存在内置于PHP中,因此Posix/C函数或shell调用也是可以接受的。

    4 回复  |  直到 17 年前
        1
  •  2
  •   dmeister    17 年前

    tmpname() tempnam() ,您可以在其中指定临时文件的目标目录。但这基本上是实现您描述的第二个选项的一种方法。

        2
  •  1
  •   pilcrow    16 年前

    这个 maildir 为……制定的协议 qmail 为同一目标目录的多个写入程序提供安全的文件创建,甚至跨NFS。在这个方案中,“tempfile”目录保证与目标目录位于同一个文件系统中。

    该算法在一个高效的shell实用程序中方便地实现, safecat ,其主页面将算法显示为:

    safecat通过分六步写入数据来应用maildir算法。 除非两个目录都存在并且都是可写的。其次,它是 名称tempdir/time.pid.host,其中time是自 1970 GMT开始时,pid是程序的进程ID,主机是 程序休眠两秒钟,更新时间,然后尝试stat() 同样,次数有限。第四,该计划创造了 tempdir/time.pid.host。第五,程序NFS将消息写入 数据成功写入的瞬间。

    此外,safecat在创建前会启动24小时计时器 tempdir/time.pid.host,并在计时器过期时中止写入。在上面 错误、超时或正常完成,safecat尝试取消链接() tempdir/time.pid.host。

        3
  •  0
  •   drAlberT    17 年前

    当然,如果您不想在目标目录中看到任何虚假文件,您可以在同一装载点上创建一个特定文件夹,而适合此任务的应用程序无法访问该文件夹,这样可以在同一装载点上模拟tempfile()。

        4
  •  -1
  •   Phill Pafford    17 年前

    我必须这样做,然后使用MySQL数据库。只是将我需要的信息存储在一个表中,当我完成时,我只是删除了记录。只是一个想法:)