Ajax Web アプリケーション、具体的にはゲームを書きたいと思っています。2 つの Web クライアントは、PHP サーバーを介して相互に通信する必要があります。これを解決するための私のアプローチは、クライアントとサーバー、およびサーバーとクライアントの間で Ajax を使用することです。各クライアントは、Ajax を使用して個別のサーバー プロセスを作成します。これら 2 つのサーバー プロセスが、MySQL と名前付きパイプを介して通信するようにしたいと考えています。アプリケーション全体の応答をすぐに取得するには、名前付きパイプが必要です。
最初にパイプを作成し、次にパイプを使用する 2 つのプロセスに分岐する 1 つのサーバー プロセスを使用することはできません。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();
}
理由を知っている人はいますか?そして、最初のステップで異なる機能間で機能させるにはどうすればよいですか? 2 番目のステップでは、異なるプロセス間でも機能するはずです。リーダーがパイプから読み取る前に、ライターがパイプを閉じるときにも問題が発生することがわかりました。関数が終了すると自動的に閉じると思いますが、これは推測に過ぎません。
PHP の方法がうまくいかない場合は、PHP でコマンド ラインを開き、BASH コマンドを生成して実行させる予定です。これは、Web サーバーが LAMP 環境で動作する限り、どのような場合でも動作するはずです。欠点は、WAMP 環境では機能しないことです。
それで、誰かこれにいくつかのアイデアがありますか?
PS: イベントが送信されるまでリーダーを待機させるには、パイプをブロックする必要があります。私はパイプがノンブロッキングモードで動作できることを知っています
stream_set_blocking($pipe,false);
かそうですが、全体的なアイデアは、イベントが発生するとすぐにリーダーを起動するパイプを使用して、ポーリングせずにそれを行うことです。