私はディスカッション プラットフォームに取り組んでおり、さまざまなクライアントが にアクセスhttp://host/thread.php
し、新しい投稿を送信するためのフォームに加えて、これまでのディスカッション スレッドが表示されます。新しい投稿が送信されたら、ブラウザー ウィンドウが開いている他のすべてのクライアントにほぼリアルタイムで表示されるようにしたいと思います。
私のスクリプトの制約の 1 つは、DBMS を使用してはならず、ファイル システムにとどまらなければならないということです。さらに、inotify などの PECL/PEAR 拡張機能を IPC に使用することはできません。
フローは次のようになります。
- クライアントAは thread.php を要求し、スレッドはまだ空ですが、それでも でサーバー側イベントを開きます
eventPusher.php
。 - クライアントBも同じことを行います。
- クライアントAがフォームに投稿を記入し、 に送信
POST
しsubHandler.php
ます。 - ???
(subHandler stores the new submission into the main thread storefile which gets read from when a fresh, new client requests thread.php, in addition to somehow signalling to the continually-running eventPusher event-source that a new comment was posted and that it should echo the event-json to the client. How, exactly, it will send this signal I'm yet unsure of, but there are a few options that I've thought of -- this is the crux of the question, so see below for more clarification)
eventPusher.php
喜んで新しいイベントをクライアントにプッシュし、最初に送信された直後に、ページを開いた画面を持つすべてのクライアントに表示されます。- 利益!
#4 ミッシングリンクのミステリーステップでは、いくつかの問題が見られます。いずれにせよ、eventPusher はwhile
ある種のループを実行することになります。つまり、何かをポーリングすることになります。それは明らかだと思います。(それが悪い仮定である場合はお知らせください。) さて、最も簡単な方法はsubHandler
、フォームの送信時に呼び出され、それを に加えてメイン ストアに書き込み、他にnewComments.xml
何もせずに終了することです。その後eventPusher
チェックインnewComments.xml
X 秒ごとに (ちなみに、ここで妥当な時間間隔はどれくらいでしょうか?)、何かを見つけた場合は、クライアントにイベントを発行します。さて、これに関して私が恐れているのは、サーバーのハード ドライブが絶えず回転し始めなければならないことです。おそらくそうではないかもしれません.RAMにキャッシュされ、Linuxカーネルがこれを透過的に処理して、ファイルシステムアクセスが実際にデバイスに関与しないようにするでしょう.最後に読んだ。* アイデア #2: どうすればよいかわかりませんが、システム上の一般的な RAM に格納され、任意のプロセスで読み取ることができる可変スコープがある可能性があります。たとえば、bash 変数をメガエクスポートして、$new_post
通常は false ですが、subHandler によって true に切り替えられ、クライアントにプッシュされると再びフラッシュに戻ります。PHPに直接そのような変数スコープがあるとは思えませんが、変数スコープの概念に苦労しています。何を読んでも理解できないようです。* アイデア #3: eventPusherps
は、自身の別のインスタンスを whileloop でクエリします。別の eventPusher がアクティブでない場合、新しいコメントが送信される可能性はほとんどありません。これが 90% 以上の確率でしか機能しない場合は問題ありません。完全に確実である必要はありません。* アイデア #4: eventPusher クエリDMESG
を実行して、そのファイルが最近書き込まれたかどうかを確認します。
したがって、すべてを要約すると、昇格された特権、PHP アドオン モジュール、または他のシステム調整なしで、標準の mod_php 共有ホスティング設定で動作するほぼリアルタイムのインター php スクリプト通信が必要です。実行時に PHP スクリプト自体から実行できます。ドライブを数回以上スピンアップ*せずに*。SQL サーバーもありません。
私の英語が最高でない場合は申し訳ありませんが、私はまだそれを改善しようとしています.