php - 使用 Ajax 的异步 PHP 查询?

标签 php javascript jquery ajax asynchronous

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

最佳答案

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 - 使用 Ajax 的异步 PHP 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13925078/

相关文章:

javascript - 将数据属性放在 DataTables 1.10 的行上

javascript 返回语句不起作用

php - php 中的 exec 工作不当

php - Codeigniter 项目社交点火器

php - 数据库类型 int 使用值进行计算

javascript - 重用javascript代码的Django最佳实践

php - 在Wordpress中上载主题时出错

javascript - 在 saga : `while(true) take()` vs `while(take())` vs. `takeEvery()` 中监听 Action 的最佳方式

javascript - 我如何通过Javascript将多个html插入模态

javascript - node.js 中的字符串插值对现有字符串模板使用反引号