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

时间:2013-06-07 18:12:02

标签: php fork

我在Stack上找到similar questions,但我不确定它们是否适用于PHP。

我想用pcntl_fork()创建子进程。我想从父进程和子进程写入消息到日志文件。

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

我害怕可能发生的竞争条件,特别是如果两个进程在不同的核上执行:如果在两个不同的核上执行的两个进程同时写入同一个文件句柄会发生什么?

1 个答案:

答案 0 :(得分:3)

根据具体情况使用flockstreamWrapper::stream_lockstream_set_blocking

  

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

flock适用于文件资源,如果fclose()即使文件未解锁,也会自动关闭。

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->timeout基本上等待文件的时间有多长,可以找到一个好例子PHP issues using flock - file locking