【问题标题】:Cancel request to PHP page results in another PHP page delayed responding取消对 PHP 页面的请求导致另一个 PHP 页面延迟响应
【发布时间】:2016-11-24 07:05:03
【问题描述】:

我正在开发一个登录页面,该页面查看 LDAP 和 MySQL 数据库以进行用户身份验证。想法是同时请求两个PHP页面,任何一个完成的请求都会取消另一个请求。

这是我的代码:

$scope.submitForm = function(username, password) {
    var ldap = $q.defer();
    var userTable = $q.defer();

    $http({
            timeout: userTable.promise,
            method: 'POST',
            url: 'crud/00loginUserTable.php',
            data: {
                username: username,
                password: password
            }
        })
        .then(function(response) {
            if (response.data.message != "ok")
                alert("Tak OK");
            else {
                sessionStorage.jwt = response.data.jwt;
                ldap.resolve();
                window.location.href = "index.php";
            }
        });

    $http({
            timeout: ldap.promise,
            method: 'POST',
            url: 'crud/00loginLDAP.php',
            data: {
                username: username,
                password: password
            }
        })
        .then(function(response) {
            if (response.data.message != "ok")
                alert("Tak OK");
            else {
                sessionStorage.jwt = response.data.jwt;
                userTable.resolve();
                window.location.href = "index.php";
            }
        });
};

这段代码确实有效。但是...

window.location.href = "index.php"; 可以执行之前有 1.3 分钟的延迟。正如我所发现的,这与 PHP 有关。我尝试将window.location.href = "index.php"; 更改为window.location.href = "index.html";。中提琴!没有延迟。所以看起来index.php 正在等待00loginLDAP.php 在响应之前超时。

我知道问题所在,但我不知道解决方案。

请帮忙。

【问题讨论】:

  • 您确定第一个请求正在取消第二个请求吗?我不认为它会这样做。两个请求都将完成。
  • 如果两个请求都成功/失败,则两个请求都已完成。但这一次,LDAP 是故意失败的(在我这里没有连接到 LDAP 服务器)。 MySQL 连接成功,几乎立即取消另一个请求,但我的问题是延迟..
  • 我认为 `ldap.resolve();` 在 window.href 之前会产生问题。通过在 `ldap.resolve();` 之后尝试 console.log() 来交叉确认这一点,以检查流程是否继续或返回。
  • 日志立即出现..
  • 尝试返回承诺return ldap.promise;

标签: php ldap


【解决方案1】:

$scope.submitForm().then(function(data){
   console.log(data);
   window.location.href = "index.php";
});

$scope.submitForm = function(username, password) {
    var ldap = $q.defer();
    var userTable = $q.defer();

    $http({
            timeout: userTable.promise,
            method: 'POST',
            url: 'crud/00loginUserTable.php',
            data: {
                username: username,
                password: password
            }
        })
        .then(function(response) {
            if (response.data.message != "ok")
                alert("Tak OK");
            else {
                sessionStorage.jwt = response.data.jwt;
                ldap.resolve('DataTable Response');
                return ldap.promise;
            }
        });

    $http({
            timeout: ldap.promise,
            method: 'POST',
            url: 'crud/00loginLDAP.php',
            data: {
                username: username,
                password: password
            }
        })
        .then(function(response) {
            if (response.data.message != "ok")
                alert("Tak OK");
            else {
                sessionStorage.jwt = response.data.jwt;
                userTable.resolve('LDAP response');
                return userTable.promise;
            }
        });
};

使用这个.. 在resolve() 中传递ldap.resolve('DataTable Response'); 数据是可选的。如果你想传递一些信息然后使用。

【讨论】:

  • 错误:$scope.submitForm 不是函数
  • 通过usernamepassword 我错过了他们...$scope.submitForm(username,password).then(function(data)
  • 仍然无法正常工作,我什至将 $scope.submitForm 包装在另一个函数中,也无法正常工作.. 相同的错误消息..
  • 错误:$scope.submitForm 不是函数
  • 好的。发现了问题。甚至与JS无关!这是PHP。重新措辞我的问题。
【解决方案2】:

据我了解here,仅取消 $http 请求不会停止 PHP 执行。另一个 PHP 页面等到第一个 PHP 页面完成的原因,因为两者都使用session_start();

我引用:

此外,如果您使用的是 PHP 会话,它们是另一个棘手的问题 情况。例如,如果你在做 AJAX,你实际上发送 对 PHP 脚本的两个 AJAX 请求,并且该 PHP 脚本需要 与 session_start() 的会话。第一个 AJAX 查询会正常工作, 但是第二个必须等到第一个电话 完成,因为第一个脚本已锁定会话。这 第一个脚本最终可能会过早地释放会话 session_write_close();

【讨论】:

    猜你喜欢
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多