0

私は、ユーザーの環境にダッシュボードとコントロール パネルを提供する PHP Web アプリケーションの作成者です。

コンテキストについては、アーキテクチャはおおよそ次のとおりです。

  • ユーザーインターフェイスリクエストを処理するPHP 5.4を備えたApache Webサーバー
  • ユーザー環境に関するデータを格納する MYSQL 5.5 (percona)
  • Northbound Interface (NBI) リクエストがユーザー環境に影響を与えることを可能にする別のシステムによってホストされる SOAP サービス
  • ユーザーの環境への変更を解釈し、検出された変更に従ってデータベースを更新する別の解析システム。

ユーザーが Web アプリケーションにログインすると、ユーザーの環境がデータベースから読み込まれ、表示されます。ユーザー インターフェイスは、PHP サーバーへの AJAX ポーリング リクエストで最新の状態に保たれます。ポーリング間隔がトリガーされるたびに後続のリクエストが「スタック」しないように、接続状態を JS ブール値に保存しておくことで、これらのリクエストが「スタック」しないように調整しました。つまり、アクティブなリクエストが完了するまで、後続のリクエストはスキップされます。

インターフェイスを最新の状態に保つためのポーリングに加えて、SOAP サービスは PHP サーバーへの AJAX 要求を介して利用でき、サーバーから NBI への同期 SOAPClient 要求をトリガーして、ユーザーの環境に影響を与える操作を実行できます。これらの要求に変更が加えられると、解析システムが最終的に変更を取得してデータベースを更新し、ポーリング メカニズムによってインターフェイスが更新され、ユーザーの観点から操作が完了します。

NBI 呼び出しを実行するユーザー開始の AJAX 要求は、SOAP 要求が解放されるまでにかなりの時間 (場合によっては 1 分以上) 続く可能性があり、SOAP 要求操作のステータスが、それをトリガーした AJAX 要求に返されます。

ユーザーの GUI では、他の AJAX リクエスト (ポーリングを含む) をロックダウンしていますが、これらの操作の 1 つが進行中であるため、一度に 1 つの AJAX リクエストのみがアクティブになるようにしています。

問題は次のとおりです。この要求が xhr.abort() によってキャンセルされた場合、NBI 呼び出しに対するサーバー側の要求は完了するまで開いたままになります。完了が保留されている間に、ユーザーが別の場所に移動したり、別の操作 (またはポーリング) を実行しようとすると、サーバーが元のキャンセルされた要求を完了するまで、要求は保留されます。

明確にするために:進行中の同時AJAXがないため、またはブラウザでリクエスト制限に達していないため、ホールドアップはサーバー側のようです。

中止された AJAX リクエストによってトリガーされた SOAP クライアント リクエストをサーバーが終了するまで、同じブラウザからのさらなるリクエストはサーバーで保留されているようです。

ストリームの途中で AJAX 要求を強制終了しても、サーバーで要求が強制終了されないことは理解していますが、NBI 呼び出しをトリガーした AJAX 要求が中止されるまで、サーバーがさらに要求を保留するのはなぜですか?

4

0 に答える 0