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


Is it safe to share a file handle between two processes in PHP?

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

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

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

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

视情况而定使用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基本上是你结束等待文件的时间,一个很好的例子可以找到使用 flock 的 PHP 问题 - 文件锁定