我想编写一个 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 命令并让它们执行。只要我的网络服务器在 LAMP 环境中工作,这在任何情况下都应该有效。缺点是它不能在 WAMP 环境中工作。
那么,有人对此有什么想法吗?
PS:我需要阻塞管道让读者等到一个事件被发送。我知道管道可以在非阻塞模式下使用
stream_set_blocking($pipe,false);
大约是这样,但整个想法是在不使用管道进行轮询的情况下做到这一点,一旦事件被触发,它就会唤醒阅读器。