2012-12-18 65 views
2

我很难理解这一点。 Ajax是异步的,很多是确定的......它在PHP上异步调用,并且PHP对数据库有一个sql查询。这意味着PHP sql查询也是异步完成的,对吧?否则,它会破坏目的。但是,如果不使用Ajax,则PHP sql查询将是同步的,是吗?我知道如何把它用于代码,但我只是困惑它如何在内部工作。使用Ajax进行异步PHP查询?

+0

对于原始的AJAX调用,SQL查询是“异步的”。与AJAX“异步”的含义是,它从Javascript的其余部分异步处理 - 它不会阻止其他代码执行。但从那时起,所有东西都必须是同步的,否则它将无法工作(不包括AJAX的'readystatechange')。 AJAX请求发送到服务器,服务器查询数据库,服务器响应,Javascript听到该响应,并且AJAX在未被阻止时立即处理该响应。 – Ian

+0

因此不,PHP SQL查询总是同步的,它是异步的HTTP请求。 – Ian

+0

现在它变得更清晰了。谢谢。你介意把你的评论作为答案,以便我可以适当地给予它的优点吗? – Wap

回答

3

对于原来的AJAX调用,SQL查询是“异步的”。不要挂在过去的术语上。客户端和服务器是完全独立的,特别是在处理HTTP请求时,在这种情况下。与AJAX“异步”的含义是,它从Javascript的其余部分异步处理 - 它不会阻止其他代码执行。但从那时起,所有东西都必须是同步的,否则它将不起作用(不包括AJAX的readystatechange)。

AJAX请求发送到服务器,服务器查询数据库,服务器响应,Javascript听到该响应,并且AJAX处理程序在其未被其他Javascript阻止时立即处理该响应。

因此不,PHP SQL查询本身总是同步的;这是异步的HTTP请求。

UPDATE

作为一个例子,这里是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)上没有任何已知信息。服务器可能会每次循环检查数据库很长一段时间,直到发生某种变化(长轮询的一个例子)才会响应。

+0

完美答案。谢谢 – Wap

2

好的,你几乎是正确的,但这里有一些规范。你对数据库的查询是异步的。请注意,您的PHP服务器将与客户机创建一个开放且唯一的数据会话。现在,当一个页面被请求时,客户端会发送一个响应,其中包含一个脚本(可能是javascript),它将在客户端机器上运行命令。在你的情况下,这些命令中的一些会对你的服务器进行异步调用,并且你的服务器会因为会话而记住。然后根据您的服务器知道的会话,它将按照您的请求提供服务。你可以调用你的数据库服务器或访问会话变量,或者做一些可能在PHP中更容易的处理。然后,当处理完成时,服务器将基于唯一会话向所讨论的客户端发回响应。作为一个重要的方面记录,请记住,任何异步操作都将花费在服务器上的时间,并做它必须做的事情。如果您在您的客户端脚本中引用变量,并在服务器完成其工作之前处理这些变量,那么它们将在客户端计算机上显示为错误(可能但很可能)。您的数据库调用将按预期异步发生。