【问题标题】:php-updating a file and reading concurrentlyphp-更新文件并同时读取
【发布时间】:2021-12-30 12:42:40
【问题描述】:

我想通过使用file_put_contents 定期更新(重写,而不是附加)来自 php 的 txt 文件。另一个 php API 读取此文件并为用户打印内容。

是否有可能当用户想通过 PHP API 读取文件时,它返回空?因为当第一个 PHP 文件尝试更新文件时,它会擦除​​数据然后写入新内容。如果可以,如何避免?

【问题讨论】:

  • 这当然有可能发生,这取决于您的服务器如何处理文件锁定。我将它作为一个三步操作来完成 - 将文件输出为新名称,完成后,删除原始文件,然后将新文件重命名为旧名称。让“其他”API 检查文件是否存在,如果不存在,则它在擦除和重命名之间的短窗口中,它可以重试。取决于输出文件需要多长时间,以及您希望多久更新一次文件,以了解这可能存在多大问题。
  • 这听起来像是数据库的用例,而不是文件
  • 另外,内容来自哪里?如果它来自数据库,为什么还要添加文件?

标签: php file


【解决方案1】:

它可以防止并确保源文件不会为空尝试以下解决方案:

  • 您可以将处理文本文件保存在 tmp 文件夹中,例如tmp_txt,您可以将其创建到与当前文本文件相同的位置,因此首先您的文本文件进入此 tmp 文件夹
  • 创建一个 shell 脚本文件并将其保存在 tmp 文件夹或任何其他文件夹下
  • 添加用于观察文件大小的 shell 脚本,并将其放入 cron 作业调度程序中

find /你的项目根路径/tmp_txt/ -type f -size +1 -name "mytext.txt" -exec mv {} /你的项目根路径/你想要的文件夹/

  • “find”是搜索文件和下一个 tmp 文件夹路径的命令”
  • “-type f”这将只考虑文件
  • “-size +1”+1 表示大于 1 KB
  • "-name "mytext.txt"" 你可以定义你的文件名,如果是动态名称则 -name "*.txt"
  • "-exec mv {}" 这会将文件移动到它旁边的路径上,如果文件大小与上述条件匹配,即 1KB,您可以根据需要更改它
  • 例如每分钟运行一次的 cronjob 条目
          • bash /yor 项目根路径/tmp_txt/shellscriptfilename>> /dev/null 2>&1

【讨论】:

    猜你喜欢
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    相关资源
    最近更新 更多