Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中两个进程之间共享文件句柄安全吗?_Php_Fork - Fatal编程技术网

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

在PHP中两个进程之间共享文件句柄安全吗?,php,fork,Php,Fork,我在Stack上找到了,但我不确定它们是否适用于PHP 我想用创建子进程。我想将来自父进程和子进程的消息写入日志文件 如果我在父级中打开一个文件句柄,那么从子级写入同一个句柄是否安全?请注意,我将只附加到该文件 我担心可能发生的比赛情况,特别是如果两个进程在不同的内核上执行:如果在两个不同的内核上执行的两个进程同时写入同一个文件句柄,会发生什么情况?使用flock或streamWrapper::stream\u lock(视情况而定)或stream\u set\u blocking 允许您执行一

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

我想用创建子进程。我想将来自父进程和子进程的消息写入日志文件

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


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

使用
flock
streamWrapper::stream\u lock
(视情况而定)或
stream\u set\u blocking

允许您执行一个简单的读写器模型,它可以在几乎所有平台上使用(包括大多数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
基本上就是你等待文件的时间,可以找到一个很好的例子

你有没有考虑过
线程
互斥体
@Baba没有,实际上我不知道这些类,但是我不习惯在生产环境中使用它们,因为
pthreads
扩展是beta版(当前版本为0.0.44),不能作为RPM包随时提供。不管怎样,这是否意味着在没有某种互斥的情况下这样做是不安全的!使用flock或:不要使用文件描述符,使用syslog或类似的流。压力测试这可能并不难,你是怎么想的。或者使用数据库。文件和I/O不可用oldschool@Benjamin它可以安全地共享。。。在生产中使用pthreads,它的工作非常好。。。即使使用
flock
您也只能在进程访问文件时重新编码一次,如所示:实际上,我刚刚意识到
flock()
操作的是资源,而不是文件名!这使得允许两个进程共享同一个句柄(如果它们在需要写入时可以锁定资源,则每个进程都可以)变得非常完美。只是出于兴趣,如果我们不使用
flock()
,会发生什么?来自不同进程的
fwrite()
调用会被序列化吗,即使它们同时发生,还是会发生一些奇怪的错误?谢谢,
c+
会使
flock()
变得不必要吗?不是无用的,你仍然需要
flock
但是文件不会像
w
那样被追加或截断。。。会更新我的答案来证明tha吗