私はこれを理解するのに苦労しています。Ajax が非同期であることは確かです... Ajax は非同期で PHP を呼び出し、PHP にはデータベースに対する SQL クエリがあります。つまり、PHP の SQL クエリも非同期で実行されるということですよね? そうしないと、目的が無効になります。しかし、Ajax を使用しないと、PHP の SQL クエリは同期になりますね。私はそれをコードに入れる方法を知っていますが、それが内部でどのように機能するかについて混乱しています。
2 に答える
SQL クエリは、元の AJAX 呼び出しから切り離されているという点で「非同期」です。それ以上の用語にとらわれないでください。クライアントとサーバーは、特に HTTP 要求を処理する場合、およびこのシナリオでは完全に分離されています。AJAX での「非同期」の意味は、残りの Javascript から非同期に処理されるということです。他のコードの実行をブロックしません。ただし、それ以降はすべて同期する必要があります。そうしないと機能しません (AJAX の readystatechange を除く)。
AJAX 要求がサーバーに送信され、サーバーがデータベースにクエリを実行し、サーバーが応答し、Javascript がその応答を受け取り、AJAX ハンドラーが他の Javascript によってブロックされていない限りすぐに応答を処理します。
いいえ、PHP SQL クエリ自体は常に同期的です。非同期の HTTP 要求です。
更新:
例として、ほとんどのライブラリが特定の方法でラップする、非常に簡素化された低レベルの AJAX を次に示します。
var xhr= new XMLHttpRequest();
var params = "x=2&y=3";
var url = "/your/url";
xhr.open("POST", url, true);
xhr.onreadystatechange = function () {
// The `xhr.readyState` changes based on the client's
// The `xhr.status` is set based on the server's response
// Normally, you check for `readyState` being 4 and `status` being 200
// meaning that the request is complete and the HTTP status code is 200 (good response)
if (xhr.readyState == 4) {
if (xhr.status == 200) {
// All good
}
} else {
}
};
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send(encodeURIComponent(params));
がxhr.send
呼び出されると、サーバーに対して非同期の HTTP 要求が行われます。これは Javascript の場合とほぼ同じです。onreadystatechange
リスナーは、変更時に実行されるものですreadyState
。4 の値は完了したことを意味し、status
200 は探しているものです...いつでも。
サーバー上では何でも起こりえます。「非同期」(無関係な)データベース呼び出しを行ったり、何らかの方法で別のサーバーに接続したり、何らかの理由で(特定の制限まで)遅延したりできます。ポイントは、サーバーが応答を返すまで、クライアント (Javascript) では何もわからないということです。サーバーは毎回データベースをチェックするために長時間ループし、特定の変更が発生するまで応答しません (ロング ポーリングの例)。
さて、あなたはかなり正しいですが、ここにいくつかの仕様があります。データベースへのクエリが非同期になるというあなたの権利。PHPサーバーは、クライアントマシンとのオープンで一意のデータセッションを作成することに注意することが重要です。これで、ページが要求されると、クライアントは、クライアントマシンでコマンドを実行するスクリプト(おそらくjavascript)を含む応答を送信します。あなたの場合、それらのコマンドのいくつかはあなたのサーバーに非同期呼び出しをします、そしてあなたのサーバーはセッションのために覚えることができます。次に、サーバーがセッションについて知っていることに基づいて、サーバーは要求に応じて呼び出しを処理します。データベースサーバーを呼び出したり、セッション変数にアクセスしたり、PHPでより簡単な処理を実行したりできます。次に、その処理が完了すると、サーバーは一意のセッションに基づいて問題のクライアントに応答を送り返します。重要な補足として、非同期で行うことはサーバー上で時間がかかり、サーバーが実行する必要があることを実行することを忘れないでください。サーバーが作業を終了する前にサーバーによって処理されているクライアントスクリプトで変数を参照すると、それらはクライアントマシン上で間違っていると表示されます(可能性はありますが、非常に可能性が高いです)。データベース呼び出しは、期待どおりに非同期で行われます。それらはクライアントマシン上で間違っているように表示されます(可能性はありますが、非常に可能性が高いです)。データベース呼び出しは、期待どおりに非同期で行われます。それらはクライアントマシン上で間違っているように表示されます(可能性はありますが、非常に可能性が高いです)。データベース呼び出しは、期待どおりに非同期で行われます。