在继续之前,PHP是否等待文件系统操作(如file_put_contents)完成?

Mat*_*att 11 php filesystems

我有一个关于PHP如何处理文件系统操作的问题.我正在运行这个代码,它取决于在使用之前创建的文件,感觉就像我运行代码时它变成了竞争条件 - 有时它运行,文件被创建并且php代码使用它,有时它失败.

所以我想知道php如何处理文件系统操作,它是在后台发送它还是等到操作完成?

Mat*_*hen 8

file_put_contents相当于fopen,fwrite,fclose. fclose应确保文件完全刷新到磁盘.

  • 实际上,确保文件完全刷新到磁盘的唯一方法是关闭驱动器上的直写式缓存.否则,您可以告诉的是文件系统发出了write命令,而不是写入实际成功提交到磁盘... (4认同)

irc*_*ell 7

是的,除非您打开文件句柄然后将其设置为非阻止模式: stream_set_blocking()

  • 事实并非如此.如果打开并简单地(f)写入,则数据不会写入磁盘.如果fwrite使用C函数fwrite,则数据很可能甚至没有到达操作系统.正如@Matthew Flaschen指出的那样,数据只在fclose和fflush期间刷新到磁盘. (2认同)

Joh*_*han 6

2013年,在具有cpanel,默认设置和php 5.2.17的我的常见花园变种linux vps上,file_put_contents对于较短的字符串长度总是需要约5ms。

偶然地,5ms就是高质量HDD的全部承诺写入时间。

file_put_contents($filename,'abcdefghi...~100chars',FILE_APPEND);
Run Code Online (Sandbox Code Playgroud)

持续大约需要5ms。这似乎包括“阻塞”和“冲洗”。因此,对于那些想知道file_put_contents的速度的人,普通服务器2013 04上至少5ms /操作。

如果您需要速度,例如一些记录,@ Matthew Flaschen说:

file_put_contents is equivalent to fopen, fwrite, fclose. 
fclose should ensure the file is fully flushed to disk.
Run Code Online (Sandbox Code Playgroud)

然后需要:

function file_put_contents_fast() {...no fclose...}
Run Code Online (Sandbox Code Playgroud)

但是需要进行一些研究才能找出如果打开文件句柄会发生什么情况。Php在出口处将关闭,但实际上是否一直如此?即使崩溃?如果文件在崩溃后被php打开,会发生什么情况?等等等。经过30分钟的php手动阅读和谷歌搜索,没有提及此类及其后果。