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 【问题描述】:我的问题如下:
php 的file_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 是否挂载sync
或async
对您无关紧要——当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 安全吗?