当前位置: 首页 > 知识库问答 >
问题:

在PHP中两个进程之间共享文件句柄安全吗?

蒋奇
2023-03-14

我在堆栈中发现了类似的问题,但我不确定它们是否适用于PHP。

我想用pcntl_fork()创建子进程。我想将来自父进程和子进程的消息写入日志文件。

如果我在父级中打开一个文件句柄,从子级写入同一个句柄是否安全?请注意,我将只附加到文件中。

我担心可能发生的争用情况,特别是如果两个进程在不同的内核上执行:如果两个进程在两个不同的内核上同时写入同一个文件句柄,会发生什么情况?

共有1个答案

傅鸿波
2023-03-14

根据具体情况使用flockstreamWrapper::stream\u lockstream\u set\u blocking

Flock()允许您执行一个简单的读/写模型,几乎可以在所有平台上使用(包括大多数Unix衍生产品,甚至Windows)。

flock在文件资源上工作,如果flock()即使文件没有解锁,也会自动关闭。

flock($fp, LOCK_EX);

您可以循环并等待,直到文件准备好打开写入在我的情况下,我使用c

while(! $fp = @fopen($this->file, "c+")) {
    if (time() - $time > $this->timeout)
        throw new Exception("File can not be accessed");
    usleep(100000);
}

$this-

 类似资料:
  • 问题内容: 我对进程之间具有文件句柄的共享资源有疑问。这是我的测试代码: 然后我得到如下图所示: 我认为当我将对象放入队列时,对象被序列化了,而文件句柄无法序列化,所以,我得到了: 有人对此有任何想法吗?如果要共享具有文件句柄属性的对象,该怎么办? 问题答案: 我不得不反对(总之,不仅仅会放在注释中;-) @Mark反复断言文件句柄不能“在运行的进程之间传递”-这在现实,现代中根本不是真的操作系统

  • 我有两个war文件,比如war1和war2 如果am登录应用程序,会话将在war1中创建,如果am导航到war2,我需要相同的会话数据。 我在服务器的context.xml尝试了Cross Context=true,我可以通过将数据存储在servletContext中来访问数据。但问题是一旦我在chrome中登录屏幕,会话数据将存储在servletContext中,数据将保持到应用程序运行。 如果

  • 问题内容: 我正在尝试使用部分函数,​​以便pool.map()可以定位具有多个参数(在本例中为Lock()对象)的函数。 这是示例代码(摘自我之前的问题的答案): 但是,当我运行此代码时,出现错误: 我在这里想念什么?如何在子流程之间共享锁? 问题答案: 您不能将普通对象传递给方法,因为它们不能被腌制。有两种方法可以解决此问题。一种是创建并传递一个: 不过,这有点重量级;使用需要产生另一个进程来

  • 问题内容: 我有两个线程。可以调用修改变量的类的update方法。另一个调用读取该变量的类的update方法。只有一个线程写入,一个(或多个)线程读取该变量。由于我是多线程技术的新手,我需要在并发方面做什么? 谢谢, 问题答案: 如果有且仅有一个写线程,你可以逃脱使得它。否则,请查看答案。 仅在只有一个写线程的情况下才起作用,因为只有一个写线程,因此它始终具有的正确值。

  • Python 3.1.2 我对多处理产生的两个线程之间的变量共享有问题。过程这是一个简单的bool变量,它应该决定线程是应该运行还是应该停止执行。下面是三种情况下显示的简化代码(但使用与我的原始代码相同的机制): 主要用于Thread加工。Thread类型和自紧度。正在运行布尔类型[工作正常] 我想了解的是为什么它是这样工作的,而不是另一种。(即,为什么第2点没有像我认为的那样起作用)。 测试是从

  • 问题内容: 该模块的文档显示了如何将队列传递给以开头的进程。但是,如何与开始的异步工作进程共享队列?我不需要动态加入或其他任何方式,而只是工人(反复)将其结果报告给基地的一种方法。 失败的原因是: 。我理解这意味着什么,并且我理解继承的建议,而不是要求进行酸洗/酸洗(以及所有Windows特殊限制)。但如何 做 我通过队列的方式,作品?我找不到一个示例,并且我尝试了多种失败的替代方法。请帮忙? 问