file_put_contents 是不是与 NFS 同步

Posted

技术标签:

【中文标题】file_put_contents 是不是与 NFS 同步【英文标题】:Is file_put_contents synchronous with NFSfile_put_contents 是否与 NFS 同步 【发布时间】:2015-10-02 12:25:36 【问题描述】:

我的问题如下:

phpfile_put_contents() 函数是否与 NFS 同步,如果是,在任何情况下都可以吗?例如,如果我通过 NFS 与之交互的远程文件系统可以是 EXT3 或 NFS,这是确保file_put_contents() 同步的重要因素吗?

谢谢!

【问题讨论】:

Does PHP wait for filesystem operations (like file_put_contents) to complete before moving on?的可能重复 我知道更多关注 NFS 以确保它不是重复的问题。谢谢! 【参考方案1】:

    PHP 甚至都不知道它正在写入 NFS。它使用操作系统的syscalls 进行文件系统访问。将文件系统调用抽象到用户空间应用程序是操作系统的职责,这包括 NFS 等远程文件系统。

    PHP 中的写操作是同步的。 PHP 等待系统调用完成以处理其结果。但是,NFS, like other file systems, can be mounted asynchroneously,这样 FS 子系统可能会报告写入成功,而实际上它只是缓存了数据以供以后写入。这是一个巨大的性能提升,但可能会在服务器崩溃时导致数据丢失。

但是,NFS sync/async 有点不同。

引用man 5 nfs的相关部分,

NFS 客户端对待同步挂载选项的方式与其他一些文件系统不同 […]。如果既没有指定同步也没有指定异步(或者如果指定了异步选项),NFS 客户端会延迟将应用程序写入发送到服务器,直到发生以下任何事件:

内存压力强制回收系统内存资源。 应用程序使用 sync(2)、msync(2) 或 fsync(3) 显式刷新文件数据。 应用程序使用 close(2) 关闭文件。 文件已通过 fcntl(2) 锁定/解锁。

换句话说,在正常情况下,由一个 应用程序可能不会立即出现在托管该应用程序的服务器上 文件。

如果在挂载点上指定了 sync 选项,则任何系统调用 将数据写入该挂载点上的文件会导致该数据 在系统调用将控制权返回给用户之前刷新到服务器 空间。这在客户端之间提供了更大的数据缓存一致性,但 以显着的性能成本。

如果在挂载点上指定了 sync 选项,则任何系统调用 将数据写入该挂载点上的文件会导致该数据 在系统调用将控制权返回给用户之前刷新到服务器 空间。这在客户端之间提供了更大的数据缓存一致性,但 以显着的性能成本。

将此应用于您的问题,这意味着:如果您的 NFS 使用 sync 安装,则每个数据块都会立即写入远程系统。使用async,当file_put_contents 完成时,文件将写入远程系统。

由于file_put_contents 以原子方式工作并以fclose 结束,因此NFS 是否挂载syncasync 对您无关紧要——当file_put_contents 结束时,数据已写入远程文件系统。如果远程服务器崩溃,PHP 无论如何都会抛出错误。在这种情况下,sync 没有任何优势。

尤其是如果您正在处理大文件,sync 会非常有害,因为每个数据块都会产生巨大的开销 用户空间 → 内核 → 网络 → 远程内核 → 远程文件系统 沟通。

因此,您应该使用 async 选项挂载 NFS,无论如何这都是默认设置。

顺便说一下,NFS 客户端不知道远程分区是 Ext3 还是什么。它只是 NFS,因此可以像任何符合 POSIX 的文件系统一样处理。

【讨论】:

非常感谢您的回复。你知道在哪里可以找到关于 NFS 的信息以及如何异步配置它吗? man 5 nfs ;) TL;DR:您可以通过挂载选项切换同步/异步。请参阅我发布的链接或自己谷歌:google.com/search?q=nfs+async 也可能想研究写入(-通过/-返回)缓存的主题。

以上是关于file_put_contents 是不是与 NFS 同步的主要内容,如果未能解决你的问题,请参考以下文章

如何将 file_put_contents() 与 FILE_APPEND | 一起使用LOCK_EX 安全吗?

file_put_contents记录的日志内容丢失

3NF 与BCNF 有啥区别? 求举个例子说明下~谢谢

3NF 与BCNF 有啥区别? 求举个例子说明下~谢谢

详解PHP file_put_contents() 函数用法示例

PHP file_put_contents() 函数