Как использовать именованные каналы в 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);

или около того, но вся идея состоит в том, чтобы сделать это без опроса, просто используя канал, который будит читателя, как только происходит событие.

Ответы на вопрос(3)

Ваш ответ на вопрос