【问题标题】:What is the behaviour if file_get_contents tries to read a file while its currently being written to如果 file_get_contents 在当前正在写入文件时尝试读取文件,会有什么行为
【发布时间】:2019-01-25 10:55:24
【问题描述】:

如果我有两个 PHP 脚本,一个使用 file_put_contents 写入文件,另一个使用 file_get_contents 从同一个文件中读取。

如果正在写入文件并且我尝试同时访问它以进行读取,我应该期待什么行为?读取会因错误而失败吗?读取会等到写入完成吗?读取会得到部分内容吗?

【问题讨论】:

  • 那...很容易自己测试...
  • 试试并告诉我们:)
  • 我猜它返回一个空字符串/false,因为该文件已被使用。也许您可以改用 fopen 和 flock
  • 根据这个问题和答案,它将读取它可以读取的内容并返回stackoverflow.com/questions/8412870/…

标签: php


【解决方案1】:

我们看一下源码

https://github.com/php/php-src/blob/master/ext/standard/file.c#L522

如果php_stream_open_wrapper_ex 无法打开流,那么您将得到错误回复。 如果您提供的seek position 无法读取,您将收到虚假回复

如果可行,它将尝试复制 stream to memory 的内容以显示所示长度

我们看到php_stream_cpy_to_memphp_streams.h 中定义,它重新定义了_php_stream_copy_to_mem,我们可以在streams.c 中找到定义

然后我们有有趣的部分在line 1411

    while ((len < maxlen) && !php_stream_eof(src)) {

因此,只要该文件尚未被读取,并且没有遇到 EOF 信号/标记,它就会被读取。如果读取值为空,它将停止进一步读取。

然后它将返回之前读取的结果。

【讨论】:

    猜你喜欢
    • 2020-05-05
    • 2011-08-15
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 2012-06-14
    • 2023-03-17
    相关资源
    最近更新 更多