我在Stack上找到similar questions,但我不确定它们是否适用于PHP。
我想用pcntl_fork()创建子进程。我想从父进程和子进程写入消息到日志文件。
如果我在父文件中打开文件句柄,从子文件写入同一句柄是否安全?请注意,我只会附加到该文件。
我害怕可能发生的竞争条件,特别是如果两个进程在不同的核上执行:如果在两个不同的核上执行的两个进程同时写入同一个文件句柄会发生什么?
答案 0 :(得分:3)
根据具体情况使用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 issues using flock - file locking