Как использовать именованные каналы в PHP между разными функциями или даже разными процессами без разветвления?
Я хочу написать веб-приложение Ajax, конкретную игру. Два веб-клиента должны общаться друг с другом через сервер PHP. Мой подход к решению этой проблемы заключается в использовании Ajax между клиентом и сервером и сервером и клиентом. Каждый клиент создает отдельный серверный процесс с использованием Ajax. Я хочу, чтобы эти два серверных процесса общались через MySQL и по именованным каналам. Мне нужны именованные каналы, чтобы получить немедленный ответ для всего приложения.
Я не могу использовать один серверный процесс, который сначала создает канал, а затем разветвляется на два процесса, которые используют канал. Веб-приложения создают серверные процессы, когда веб-браузер отправляет запрос. Итак, мне нужны именованные каналы, где каждый процесс нене знаю больше, чем имя файла именованного канала. Они не могут обмениваться дескрипторами файлов (по крайней мере, я нене знаю как).
Моя проблема в том, что именованные каналы в стиле 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.
Итак, есть ли у кого-нибудь идеи по этому поводу?
П.С .: Мне нужны блокирующие каналы, чтобы читатель дождался отправки события. Я знаю, что трубы могут работать в неблокирующем режиме, используя
stream_set_blocking($pipe,false);
или около того, но вся идея состоит в том, чтобы сделать это без опроса, просто используя канал, который будит читателя, как только происходит событие.