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

2024-01-08

我找到了类似的问题 https://stackoverflow.com/q/2358684/759866在 Stack 上,但我不确定它们是否适用于 PHP。

我想创建子进程pcntl_fork() http://php.net/manual/en/function.pcntl-fork.php。我想将父进程和子进程的消息写入日志文件。

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

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


Use flock or streamWrapper::stream_lock视情况而定或stream_set_blocking

flock() http://php.net/manual/en/function.flock.php允许您执行一个简单的读取器/写入器模型,该模型几乎可以在每个平台上使用(包括大多数 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 使用集群的问题 - 文件锁定 https://stackoverflow.com/a/16998949/1226894

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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