4

我很难理解这一点。Ajax 是异步的,这是肯定的……它异步调用 PHP,并且 PHP 有一个对数据库的 sql 查询。这意味着PHP sql查询也是异步完成的,对吧?否则,它就达不到目的。但是如果不使用 Ajax,PHP sql 查询将是同步的,是这样吗?我知道如何把它写成代码,但我只是对它在内部的工作方式感到困惑。

4

2 回答 2

4

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 表示它已完成,而status200 是您正在寻找的……无论何时

服务器上可能发生任何事情。您可以进行“异步”(不相关)数据库调用,以任何方式联系不同的服务器,以任何原因延迟(达到一定限度)或类似的事情。关键是在服务器返回响应之前,客户端 (Javascript) 上一无所知。服务器每次都可以循环很长时间检查数据库,并且在发生某种变化之前永远不会响应(长轮​​询的一个例子)。

于 2012-12-18T02:45:42.750 回答
2

好的,你说得非常正确,但这里有一些规范。您有权对数据库进行异步查询。请务必注意,您的 PHP 服务器将与客户端计算机创建一个开放且唯一的数据会话。现在,当请求页面时,客户端将发送一个响应,其中将包含一个脚本(可能在 javascript 中),该脚本将在客户端计算机上运行命令。在您的情况下,其中一些命令对您的服务器进行异步调用,并且您的服务器可以因为会话而记住。然后根据您的服务器对会话的了解,它将根据您的请求为调用提供服务。您可以调用您的数据库服务器或访问会话变量或执行某种在 PHP 中可能更容易的处理。然后,当该处理完成时,服务器将根据唯一会话将响应发送回相关客户端。作为一个重要的附带说明,请记住,您异步执行的任何操作都将在服务器上花费时间并执行它必须执行的操作。如果您在客户端脚本中引用在服务器完成其工作之前由服务器处理的变量,它们将在您的客户端计算机上显示为错误(可能但很可能)。您的数据库调用将按照您的预期异步发生。它们将在您的客户端计算机上显示为错误(可能但很有可能)。您的数据库调用将按照您的预期异步发生。它们将在您的客户端计算机上显示为错误(可能但很有可能)。您的数据库调用将按照您的预期异步发生。

于 2012-12-18T02:25:39.977 回答