我发现了类似的问题,但我不确定它们是否适用于 PHP。
我想用pcntl_fork()创建子进程创建子进程。我想从父进程和子进程将消息写入日志文件。
如果我在父级中打开一个文件句柄,从子级写入同一个句柄是否安全?请注意,我只会附加到文件中。
我担心可能发生的竞争条件,特别是如果两个进程在不同的内核上执行:如果在两个不同的内核上执行的两个进程同时写入同一个文件句柄会发生什么?
我发现了类似的问题,但我不确定它们是否适用于 PHP。
我想用pcntl_fork()创建子进程创建子进程。我想从父进程和子进程将消息写入日志文件。
如果我在父级中打开一个文件句柄,从子级写入同一个句柄是否安全?请注意,我只会附加到文件中。
我担心可能发生的竞争条件,特别是如果两个进程在不同的内核上执行:如果在两个不同的内核上执行的两个进程同时写入同一个文件句柄会发生什么?
使用flock
或streamWrapper::stream_lock
视情况而定或stream_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 问题使用flock - 文件锁定