【问题标题】:How to cancel ajax request that has run (on server side)如何取消已运行的 ajax 请求(在服务器端)
【发布时间】:2010-10-22 10:22:45
【问题描述】:

我想知道是否有一种简单的方法可以取消 AJAX 请求?

除了在客户端调用 XMLHTTPRequest 的“中止”之外,有没有办法轻松停止服务器进程?服务器正在使用 Apache。

谢谢

【问题讨论】:

    标签: php ajax request-cancelling


    【解决方案1】:

    对于 PHP,我找到了一种使用 session_write_close(); 停止或中止的方法。只需将其放在脚本上的 session_start() 之后即可。如果您使用的是框架或 OOP,请将其保留为方法的第一行。发生这种情况是因为会话数据在 ajax 完成之前被锁定。

    测试并看到在xhr.abort() 之后正在加载另一个页面

    在此处找到解决方案提示 Abort Ajax requests using jQuery

    【讨论】:

      【解决方案2】:

      如何发送另一个 Ajax 请求来更改特定的 $_SESSION var,它由那个漫长的过程监控?

      【讨论】:

        【解决方案3】:

        没有什么好的方法可以通过网络阻止请求本身(正如许多人所说),但是阻止请求的影响相对容易。即

        在服务器端:您可以exit(或您需要终止脚本的任何术语)通过不断检查全局变量(充当标志),如 cookie 或会话(再次假设这些会在脚本的执行)。此外,您可以将文件或数据库条目作为标志(您可以轮询是否存在)。

        在客户端:您可以调用abort(这在所有浏览器中都不起作用,就像其他人所说的那样),或者您可以在回调顶部保留一个全局信号量/标志(检查全局值以查看它是否仍应执行)。示例:

         window.ajaxIsStillGood = true;
        
         xhr.onreadystatechange = function( )
         {
             if( 4 === xhr.readyState && 200 === xhr.status )
             {
                 if( true === window.ajaxIsStillGood ){ /* still good */ }
             }
         }
        
         /* bad stuff happens */
        
         window.ajaxIsStillGood = false; // now the code won't execute
        

        【讨论】:

          【解决方案4】:

          发起另一个 Ajax 请求。我通过试图弄清楚如何防止先前的请求在另一个请求被调用时被中断而找到了这个线程。

          【讨论】:

            【解决方案5】:

            简短的回答是“不”。除非您在服务器端谈论一个运行时间很长的后台进程,在这种情况下,您可以让第二个 Ajax 请求在其上启动停止。但是,如果您谈论的是对 Apache/PHP 服务器的常规请求,那么不...确定您的请求在哪个 Apache 线程中运行就够麻烦了。

            在开始流程之前以某种方式验证您的 Ajax 请求会容易得多;确保它是你想要运行的。如果您需要用户知道他们正在做的事情不能被打断,您也可以有一个 Javascript 确认过程。

            正如 Steven 所说,有一个逆转过程听起来也可能符合您的最大利益。

            【讨论】:

              【解决方案6】:

              最简单的方法是发送 503(或类似的)HTTP 响应标头并中止服务器端应用程序(或只是中止应用程序)。假设没有发送数据和/或您检查了客户端的 HTTP 响应标头,您可以将其视为失败的请求。

              【讨论】:

                【解决方案7】:

                没有。绝对没有简单的方法。

                我能想到一些复杂的方法,但它们并不可靠。

                您可能会更幸运地开发一个流程来逆转您刚刚运行的请求的更改(我假设这就是您想要停止它的原因。)

                【讨论】:

                • 原因将是停止占用资源的漫长过程,因此与对数据库的修改无关。谢谢回复
                • 正如下面的 zombat 所提到的,如果这是一个漫长的过程,您可能有时间做一些事情,但是识别 Apache 线程将非常困难。您必须设置某种存储机制来将正在运行的脚本链接到请求(这意味着请求需要包含某种唯一的 id)。如果您将该链接存储在数据库中,您可以发送第二个请求以将该请求标记为已取消,然后定期从您的运行脚本轮询该数据库记录以查看您是否可以停止工作。这将非常复杂,并且有很大的潜在错误/恶意活动。
                猜你喜欢
                • 2019-06-01
                • 2013-04-14
                • 2012-10-11
                • 2011-06-01
                • 2017-09-07
                • 1970-01-01
                • 2012-05-28
                • 2023-03-30
                • 1970-01-01
                相关资源
                最近更新 更多