【发布时间】:2013-06-04 03:11:34
【问题描述】:
我在 Stack 上找到了 similar questions,但我不确定它们是否适用于 PHP。
我想用pcntl_fork() 创建子进程。我想将消息从父进程和子进程写入日志文件。
如果我在父级中打开一个文件句柄,从子级写入同一个句柄是否安全?请注意,我只会附加到文件中。
我担心可能发生的竞争条件,特别是如果两个进程在不同的内核上执行:如果在两个不同的内核上执行的两个进程同时写入同一个文件句柄会发生什么?
【问题讨论】:
-
你考虑过
Thread和Mutex -
@Baba 不,我没有,实际上我不知道这些类,但是我不习惯在生产环境中使用它们,因为
pthreads扩展是测试版(当前版本0.0.44),并且不容易作为 RPM 包提供。无论如何,这是否意味着没有某种互斥锁就不安全了? -
试错!使用flock 或:不使用文件描述符,使用流到syslog 或类似的。如您所想,压力测试可能并不困难。或使用数据库。文件和 I/O 是老式的
-
@Benjamin 它可以安全地共享......并且在生产中使用 pthreads 并且它工作得非常好......即使使用
flock,您也只能在进程访问文件时重新进行演示:@ 987654323@ -
其实我才意识到
flock()是对资源进行操作,而不是对文件名进行操作!这使得允许两个进程共享同一个句柄是完美的(如果它们可以在需要写入资源时锁定资源)。只是出于兴趣,如果我们不使用flock()会发生什么?来自不同进程的fwrite()调用是否会被序列化,即使它们同时发生,还是会发生一些奇怪的错误?