相互にブロックする同時 AJAX リクエスト
特定の状況では、AJAX リクエストが同時に実行されず、予期しない動作が発生することがあります。この問題は、データを XSLX ファイルにエクスポートする際に進行状況を表示するように設計された 2 つの同時 AJAX リクエストで問題が発生したときに発生しました。最初のリクエストは長い PHP スクリプトをトリガーし、2 番目のリクエストは定期的に進行状況の更新をチェックします。
調査の結果、2 番目の AJAX リクエストは最初のリクエストが完了するのを待ってから実行されることが判明しました。この動作は、PHP のセッション ブロックが原因であると考えられます。
PHP のセッション ブロック
デフォルトでは、PHP はファイルを使用してセッション データを保存します。セッションが開始されると (session_start() 関数を使用)、PHP は書き込み用にセッション ファイルを開き、排他的アクセスを確保するためにそれをロックします。このロック メカニズムにより、同時リクエストが同時にファイルにアクセスすることが防止されます。その結果、2 番目の AJAX リクエストは、最初のリクエストが完了してセッション ファイルのロックが解除されるまで待機してから実行する必要がありました。
解決策
これに対する解決策問題は、PHP のデフォルトのファイルベースのセッション ストレージを無効にするか、セッション ファイルへの書き込み後にセッション ファイルを明示的に閉じてロックを解除することです。
ファイルベースのセッション ストレージを無効にするには、php.ini に次の行を追加します。 file:
session.save_path =
セッション ファイルを明示的に閉じるには、session_write_close() 関数を使用します:
<code class="php"><?php session_start(); $_SESSION['foo'] = 'bar'; // Write data to the session session_write_close(); // Close the session file echo $_SESSION['foo']; // You can still read from the session. ?></code>
これらのソリューションを実装することで、2 番目の AJAX リクエストが確実に同時に実行されるようにすることができます。最初のものを使用すると、遅延なく進行状況を追跡できます。
以上がPHP で AJAX リクエストが相互にブロックされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。