系统相关
首页 > 系统相关> > 如何在PHP之间使用不同函数甚至不同进程的不同进程的命名管道?

如何在PHP之间使用不同函数甚至不同进程的不同进程的命名管道?

作者:互联网

我想写一个Ajax Web应用程序,一个特定的游戏.两个Web客户端必须通过PHP服务器相互通信.我解决这个问题的方法是在客户端和服务器以及服务器和客户端之间使用Ajax.每个客户端使用Ajax创建一个单独的服务器进程.我希望这两个服务器进程通过MySQL和命名管道进行通信.我需要命名管道来获得整个应用程序的即时响应.

我不能使用一个服务器进程,它首先创建一个管道,然后分叉成两个使用管道的进程. Web应用程序在Web浏览器发送请求时创建服务器进程.所以,我需要命名管道,其中每个进程都不知道命名管道的文件名.他们无法交换文件句柄(至少我不知道如何).

我的问题是PHP方式的命名管道确实可以正常工作
在同一函数中使用:

public function writeAndReadPipe_test(){
    $pipeA = fopen("testpipe",'r+');
    fwrite($pipeA, 'ABCD');

    $pipeB = fopen("testpipe",'r+');
    $content = fread($pipeB, 4);
    echo "[" . $content . "]<br>\n";
}

public function testingPipes_same_function(){
    posix_mkfifo("testpipe", 0777);
    $this->writeAndReadPipe_test();
}

但是,当我使用不同的函数时,fread($pipeB,4)命令会阻止整个应用程序:

public function writePipe_test(){
    $pipeA = fopen("testpipe",'r+');
    fwrite($pipeA, 'ABCD');
}

public function readPipe_test(){
    $pipeB = fopen("testpipe",'r+');
    $content = fread($pipeB, 4);
    echo "[" . $content . "]<br>\n";
}

public function testingPipes_different_functions(){
    posix_mkfifo("testpipe", 0777);
    $this->writePipe_test();
    $this->readPipe_test();
}

有人知道为什么吗?我能做些什么才能让它在第一步中的不同功能之间起作用?在第二步中,它应该在不同的进程之间工作!我发现当编写器在读取器读取之前关闭管道时,我也遇到了问题
它.我想该函数在结束时自动关闭它,但这只是猜测.

如果PHP方式不起作用,我打算让PHP打开命令行,生成BASH命令并执行它们.只要我的Web服务器在LAMP环境中工作,这应该适用于任何情况.缺点是它不适用于WAMP环境.

那么,有人对此有什么想法吗?

P.S:
我需要阻塞管道让读者等到事件发送完毕.我知道管道可以使用非阻塞模式工作

stream_set_blocking($pipe,false);

左右,但是整个想法是在没有使用管道进行轮询的情况下进行此操作
一旦事件被解雇,读者就会被提起.

解决方法:

当你在像这样的单独函数中使用管道时,写管道A似乎再次被关闭/丢弃($pipeA的本地范围).假设管道必须打开以进行读取和/或写入以保留任何信息,这实际上是有意义的.虽然我不知道内在的魔力.

当您从另一个进程(例如echo magic>> testpipe)提供管道时,您还可以观察到阻塞的读取调用成功.所以你已经完成了第2步,但是你需要一些管道处理.

如果你改变它如下,它的工作:

    private $pipeA;
    public function writePipe_test(){
        $this->pipeA = fopen("testpipe",'r+');
        fwrite($this->pipeA, 'ABCD');
    }

编辑:或设置$pipeA以具有全局范围,就此而言..

标签:php,named-pipes,blocking
来源: https://codeday.me/bug/20191009/1877275.html