我的问题如下:
PHP的file_put_contents()
功能是否与NFS同步,如果是,是否在任何情况下?例如,如果我通过NFS交互的远程文件系统可以是EXT3或NFS,那么这是确保file_put_contents()
同步的一个重要因素吗?
谢谢!
PHP甚至不知道它正在写入NFS.它使用操作系统的系统调用来进行文件系统访问.操作系统负责将文件系统调用抽象到用户空间应用程序,这包括NFS等远程文件系统.
PHP中的写操作是同步的.PHP等待系统调用完成处理其结果.但是,与其他文件系统一样,NFS可以异步挂载,这样FS子系统可以报告成功写入,而实际上它只缓存了数据以供稍后写入.这是一个巨大的性能提升,但在服务器崩溃时可能导致数据丢失.
但是,NFS sync
/ async
有点不同.
引用相关部分man 5 nfs
,
NFS客户端以不同于某些其他文件系统的方式处理同步安装选项[...].如果既未指定同步也未指定async(或者如果指定了async选项),则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的文件系统一样对待.
归档时间: |
|
查看次数: |
965 次 |
最近记录: |