現在、私たちは Ajax リクエストに依存する多くのアプリケーションを開発しています。場合によっては、ページ全体が Ajax に依存していることもあります。 Web ページが 2 つ以上の Ajax リクエストを送信すると、PHP の応答時間が非常に長くなり、同時に応答コンテンツが返されることに気づくことがあります。
この問題は、PHP セッションの処理方法が原因で発生する可能性が高く、この記事に従ってこの問題を理解し、回避する方法を講じてください。
コンテンツ
PHPセッションとは何ですか?
この問題を理解するには、まず PHP セッションと Ajax、およびそれらがどのように干渉するかを理解する必要があります。
Web アプリケーションを開発していて、さまざまなユーザーを識別したいとします。ログインせずに毎回誰がすべてのページにアクセスしたかを記憶したい場合は、Cookie またはセッションを使用できます。
お気づきかと思いますが、セッションは、任意のページから取得できるユーザー情報を保存する方法です。 Cookie とは異なり、セッションはサーバーに保存されるため、ユーザーはこの情報を直接変更できません。
デフォルトでは、セッションはユーザーがブラウザを閉じるまで、またはユーザーが PHP 構成ファイルで指定された期間非アクティブになった後に期限切れになるまで有効です。
PHP ページでは、ユーザー データを保存または取得する場合は常に、ページの先頭で session_start() を呼び出す必要があります。これにより、セッション データを取得するために $_SESSION を使用する権限が得られます。
Ajax とは何ですか?
Ajax は Asynchronous JavaScript and XML の略で、ページ全体をリロードせずにサーバーとの間でデータを送受信する方法です。
この方法を使用して、データを送信し、サーバーからデータをより速く取得します。時間がかかるため、ページ全体を取得してブラウザでレンダリングする必要はありません。
したがって、ページ全体をリロードしなくても、新しいコンテンツが追加されると、ユーザーが Facebook のタイムライン ページを下にスクロールして見たいものを見るのと同じように、ページの一部を更新してその変更をユーザーに表示することができます。
具体的な質問
ほぼ 100% Ajax に基づいた Web アプリケーションの開発は新しいことではありませんが、Web ページが 2 つ以上の Ajax リクエストを同時に送信すると、リクエストに時間がかかることに気づくでしょう。ほぼ同時に依頼が完了しました。
理由
サーバーに Ajax リクエストを送信させる場合、PHP スクリプトも session_start() を開き、その呼び出しによって PHP セッション ファイルがロックされます。
すでにご存じのとおり、PHP はデフォルトでセッション データをサーバー上のファイルに保存します。同じセッション ファイルを変更できる PHP リクエストは 1 つだけであるため、2 つの PHP リクエストが同時に発生すると、典型的なファイル ロック状態が発生する可能性があります。そのため、同じユーザーに対して PHP によって呼び出される他の session_start() リクエストは、最初のリクエストが終了するまで待機する必要があります。
現在、ほとんどの PHP フレームワークは、最初にメイン ファイルで session_start() を使用します。したがって、session_start() を呼び出すフレームワークまたはライブラリを使用している場合、セッション ファイル ロックが発生し、同じブラウザを使用する同じユーザーへの同時 Ajax リクエストが遅延します。
問題の解決策
session_write_close() 関数を呼び出すと、PHP がセッション ファイルを書き込んで閉じるため、セッション ファイルが解放された後、別のリクエストに書き込み権限が与えられます。
session_write_close() を呼び出した後、現在のスクリプトは通常通り実行され続けますが、同じスクリプト内で session_write_close() を呼び出した後はセッション変数を変更することはできないことに注意してください。同時にセッション ファイルをロックし、セッション変数を変更することができます。
このような問題を見てもらうために、テストコードを作成して github にアップロードしました。テスト スクリプトはここにあります。ローカルでは、インスタンスを使用してテスト コードを使用し、ブラウザ コンソールを開いてリクエストと応答時間を確認する必要があります。
このファイルのサンプル コードにあるように、以下のコードのように複数のリクエストを作成すると...
<code><span>session_start()</span>; <span>sleep(<span>5</span>)</span>;</code>
同じユーザーの各リクエストは、前のリクエストが完了するまで待機してから完了します。スクリプトが完了するまでセッションファイルは解放されないため、5 秒かかります。したがって、session_start() が初めて呼び出されるとき、新しいリクエストはブロックされます。そうなると、非同期リクエスト、つまり複数のリクエストが同時に送信され実行されるという考えが消えてしまいます。
ファイル内のコードを変更すると:
<code><span>session_start()</span>; <span>// do something useful here</span><span>session_write_close()</span>; <span>sleep(<span>5</span>)</span>;</code>
コードの 3 行目でセッション ファイルのロックが解放され、別の同時リクエストは問題なく session_start() を呼び出すことができるため、待機することなく実行できます。
まとめ
PHP は少し微妙で、なぜ奇妙なことが起こるのか心配になるでしょう。しかし、物事がどのように機能するかを理解すると、すべてが理にかなっており、問題の解決についてよりよく考えることができるようになります。
翻訳元:http://www.ido321.com/1577.html
この記事は @Eslam Mahmoud の「Fix the AJAX Requests that Make PHP Take Too Long to Respond」を元に翻訳したものであり、翻訳全体に私自身の理解や考えが含まれております。翻訳が良くない場合や間違っている場合はご質問ください。同じ分野で働く友人。この翻訳を転載したい場合は、英語のソースを明記してください: http://www.phpclasses.org/blog/post/277-Fix-the-AJAX-Requests-that-Make-PHP-Take-Too-Long- to- Respond.html
以上、AJAXリクエストでPHPの応答に時間がかかりすぎる問題の解決方法を内容も含めて紹介しましたので、PHPチュートリアルに興味のある方の参考になれば幸いです。