3

私はいくつかの webapp を構築しており、ロングポーリング (およびデータベースにコマンドキュー) を実装しているため、サーバーはコマンドをクライアントに非同期で送信できます。コマンドは json にエンコードされ、クライアントからサーバーへの ajax 呼び出しを介して送信されます。サーバーからクライアントへのロングポーリングを介して。

「認証モジュール」をajax.phpファイルに含めるまで、すべてがうまく機能していました。このモジュールは、セッションのものをラップし、session_start() を呼び出します。

問題は、私の長いポーリング ルーチンが、クライアントに戻る前に最大 21 秒待機できることです。この間、サーバーは同じセッションから何も実行しません。代わりに、長いポーリング ajax 呼び出しが返された直後に実行されます。

一度にセッションごとに 1 つのスレッドのみという制限があり、リクエストがキューに入れられることを理解しています。

ここで質問です。これに対処する最善の方法は何ですか? セッションごとに複数のスレッドを許可する設定はありますか (私の場合は 3 つでも問題ありません)。または、クライアントに彼のSessionIDが何であるかを送信する必要があります(どのユーザーがどのセッションに接続されているかを追跡するために、データベースにいくつかのセッションテーブルがあります)。クライアントは、認証モジュールをバイパスできるように、任意の ajax 呼び出しと共にそれを送信できます。

後者のオプションでは、最終的なセッションのなりすましのために、多くのセキュリティ問題が発生するのではないかと心配しています. 簡単になりすましができないように、各セッションに「ランダムな文字列」を送信する必要がありますが、それでも完璧ではありません...

あなたのオーサーをありがとう:)

ニコラ・ゴーティエ

4

1 に答える 1

4

競合状態を防ぐために、使用中に PHP がセッション ファイルをロックすることはよく知られている問題/事実です。

PHP ソース コード (ext/session/mod_files.c) を見ると、ps_files_open関数がセッション ファイルをロックし、ps_files_closeロックを解除していることがわかります。

実行時間の長いスクリプトの開始時に呼び出しsession_start()、セッション ファイルを明示的に閉じない場合、スクリプトが終了するまでセッション ファイルはロックされます。終了すると、PHP はスクリプトのシャットダウン中にすべてのファイル ロックを解放します。

セッションを使用していない間はsession_write_close、セッション データをディスクにフラッシュするために呼び出し、他の「スレッド」がデータを読み取れるようにロックを解除する必要があります。

ファイルがロックされていないとどうなるか想像できると思います。

T1: Open Session
T2: Open Session
...
T2: Write Data
T1: Write Data

スレッド 2 によって書き込まれたデータは、スレッド 1 によって完全に上書きされます。同時に、スレッド 1 が書き込もうとしていたデータは、スレッド 2 では利用できませんでした。

于 2012-08-17T14:40:39.273 に答える