【问题标题】:Is it safe to share a file handle between two processes in PHP?在 PHP 中的两个进程之间共享文件句柄是否安全?
【发布时间】:2013-06-04 03:11:34
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你考虑过ThreadMutex
  • @Baba 不,我没有,实际上我不知道这些类,但是我不习惯在生产环境中使用它们,因为 pthreads 扩展是测试版(当前版本0.0.44),并且不容易作为 RPM 包提供。无论如何,这是否意味着没有某种互斥锁就不安全了?
  • 试错!使用flock 或:不使用文件描述符,使用流到syslog 或类似的。如您所想,压力测试可能并不困难。或使用数据库。文件和 I/O 是老式的
  • @Benjamin 它可以安全地共享......并且在生产中使用 pthreads 并且它工作得非常好......即使使用flock,您也只能在进程访问文件时重新进行演示:@ 987654323@
  • 其实我才意识到flock()是对资源进行操作,而不是对文件名进行操作!这使得允许两个进程共享同一个句柄是完美的(如果它们可以在需要写入资源时锁定资源)。只是出于兴趣,如果我们不使用flock() 会发生什么?来自不同进程的fwrite() 调用是否会被序列化,即使它们同时发生,还是会发生一些奇怪的错误?

标签: php fork


【解决方案1】:

根据具体情况使用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

【讨论】:

  • 谢谢,c+ 使flock() 变得不必要了吗?
  • 不是没用,你仍然需要flock,但文件没有被附加,也没有像w那样被截断......会更新我的答案来证明你
猜你喜欢
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多