【问题标题】:Coordinate two programs that read/write the same file?协调两个读/写同一个文件的程序?
【发布时间】:2020-11-16 04:31:41
【问题描述】:

我有两个需要通信的独立程序:一个 PHP 程序和一个 Java 守护程序。 PHP 程序将命令写入日志文件。 Java 守护进程读取它们、执行它们并清除日志。

这大约有 2/3 的时间有效。

我认为问题在于 PHP 有时正在编写命令,而 Java 守护进程正在读取或执行命令。这意味着当它进入清除命令的阶段时,它会从 PHP 中删除新命令,而不会执行它们。

是否有更合理的方式来构建事物,以确保来自 PHP 的新命令不会与旧命令一起被删除?

【问题讨论】:

  • 不在文件系统级别和所有操作系统上。可以做的是让每个进程创建一个.lock 文件以向另一个进程发出信号“嘿,我正在处理文件,不要碰它”,并在进程完成后将其删除。在访问文件之前,每个进程都必须检查.lock 文件是否存在并等待它不存在。
  • 有道理,谢谢你的想法!
  • 取决于您的操作系统。互斥锁、信号量或读写器锁是合适的——如果您有跨进程同步对象的操作系统(和语言支持)。 linux.die.net/man/7/sem_overview
  • 我认为最好的方法是不使用文件系统来发送命令。您可以考虑使用套接字或 http 服务器直接向 java 守护程序发送命令。

标签: java php rest


【解决方案1】:

这是日志文件轮换的常见问题,此处使用的模式可以直接应用于这种情况。

不要从外部进程中截断文件,这几乎肯定会导致数据丢失。相反,让 PHP 定期关闭它正在写入的文件,并切换到写入新文件。

读取文件的 Java 进程可能会通过定期列出目录内容或通过subscribing to file creation events with the FileWatcher API 来检测 PHP 已切换到另一个文件。

另一种选择是让 PHP 进程将“嘿,我正在切换到另一个文件”消息写入文件,并让 Java 进程在读取此消息时切换文件。

【讨论】:

    猜你喜欢
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 2015-04-18
    相关资源
    最近更新 更多