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

时间:2010-07-21 23:39:39

标签: php filesystems

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

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

4 个答案:

答案 0 :(得分:8)

file_put_contents相当于fopenfwritefclosefclose应确保将文件完全刷新到磁盘。

答案 1 :(得分:7)

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

答案 2 :(得分:4)

2013年,在我的常见花园种类linux vps with cpanel,默认设置,php 5.2.17,file_put_contents总是需要~5ms短串长。

意外的5ms是关于高质量硬盘的完整承诺写入时间。

file_put_contents($filename,'abcdefghi...~100chars',FILE_APPEND);

这持续约5毫秒。这似乎包括'阻塞'和'冲洗'。所以对于那些想知道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.

然后需要:

function file_put_contents_fast() {...no fclose...}

但是需要进行一些研究才能找出如果文件句柄保持打开会发生什么。 Php closes them at exit,但它确实一直这样做吗?即使它崩溃了?如果文件在崩溃后由php保持打开会发生什么?经过30分钟的php手动阅读和谷歌搜索,没有提到这样及其后果。

答案 3 :(得分:3)

PHP应该等到该过程完成。但不知道你是如何实施这些操作的,很难说。如果你可以发布一个你正在使用的示例代码,那么我们可以帮助你找出它无法正常工作的原因。