当前位置: 首页 > 面试题库 >

connection_aborted()在ajax调用上不起作用

王修为
2023-03-14
问题内容

已编辑

我有一个ajax调用(使用$.ajax()),它调用以下php脚本。

for ($i=0;$i<40;$i++) {
    echo " ";
    flush();
    if (connection_aborted()) {
        log_message('error','CONNECTION IS ABORTED!!!!!');
        exit;
    }
    else {
        log_message('error','connection not aborted :(');
    }
    sleep(1);
}

这持续了40秒。

如果我关闭触发调用的浏览器窗口connection_aborted()即使我显式发送了一个字符串并刷新了缓冲区 ,它仍然返回false

请问有人在这里回答吗?


问题答案:

您将需要添加“ ignore_user_abort(true);” 在PHP脚本之上,并在从脚本中回显某些内容后调用“
ob_flush()”(有关原因,请参见 PHP
flush()手册页
)。工作示例(概念验证):

<?php

ignore_user_abort(true);

function log_message($s, $ss) {
  $myFile = "log.txt";
  $fh = fopen($myFile, 'a') or die("can't open file");
  $stringData = $s . ": " . $ss . "\n";
  fwrite($fh, $stringData);
  fclose($fh);
}



for ($i=0;$i<5;$i++) {

    echo "<br>";
    //flush();
    ob_flush();

    if (connection_aborted()) {
        log_message('error1', connection_status());
        exit;
    }
    else {
        log_message('error2', connection_status());
    }

    sleep(1);
}

如果连接仍处于活动状态,则PS connection_status()返回0,如果关闭则返回1。

编辑:

我的错。调用flush()和ob_flush()(请阅读flush()手册页,上面的链接,以及
本主题的),否则可能不起作用,具体取决于服务器/ php配置。以下代码已在WAMP和PHP
5.3.8上进行了测试(无需调用flush()即可工作),现在已在Ubuntu PHP
5.3.10上进行了测试。需要在ob_flush()之前调用flush()的位置。

完整的测试代码:

index.html:

 <html>
  <head>
    <script src="http://code.jquery.com/jquery-1.8.0.min.js"></script>

    <script>

      $(document).ready(function() {

        $.ajax({
          url: "script.php",
          context: document.body
        }).done(function(data) { 
         alert(data);
        });

      })

    </script>

  </head>

  <body>
  </body>

</html>

script.php:

ignore_user_abort(true);

function log_message($type, $message, $file = 'log.txt') {
    $fh = fopen($file, 'a') or die("can't open file");

    $conn_status = connection_status();

    if($conn_status === CONNECTION_NORMAL) {
        $status = 'normal';
    } elseif($conn_status  === CONNECTION_ABORTED) {
         $status = 'aborted';
    } else {
        $status = 'timeout';
    }

    $aborted = connection_aborted() ? 'yes' : 'no';

    $data  = $type . ': ' . $message . "\n";
    $data .= 'Connection status: ' . $status . "\n";
    $data .= 'Aborted: ' . $aborted . "\n\n\n";

    fwrite($fh, $data);
    fclose($fh);
}



for ($i = 0; $i < 10; $i++) {

    echo "<br>";
    flush();
    ob_flush();

    if (connection_aborted()) {
        log_message('Error', 'Connection closed by user!');
        exit;
    }
    else {
        log_message('Info', 'Everything is fine. Move along...');
    }

    sleep(1);
}

调用index.html页面并关闭选项卡或整个浏览器后,您应该在log.txt文件中看到以下信息:

Info: Everything is fine. Move along...
Connection status: normal
Aborted: no


Info: Everything is fine. Move along...
Connection status: normal
Aborted: no


Info: Everything is fine. Move along...
Connection status: normal
Aborted: no


Error: Connection closed by user!
Connection status: aborted
Aborted: yes


 类似资料:
  • 问题内容: 我制作了一个Jquery函数,该函数(目前)会动态调用该函数,并显示警告。与Firefox,铬:它的作品!当我尝试IE7(第一次)时,它失败了。如果我重新加载页面(F5)并重试,则可以!o_O 我终于明白为什么会这样。在我的旧网站中,我使用了jquery-1.3.2.min.js库。在此我使用jquery-1.4.2.js,实际上它不起作用。那么这是什么一回事?这个新版本中有错误吗?

  • 问题内容: 我有一个JSF表单,上面有一个selectBooleanCheckbox。如果该复选框的值为true,则要在其旁边显示组合框。但是不知何故它不起作用。 这是我的代码: Bean类方法: 注意:从FireBug复制 这是POST请求: 响应: 问题答案: 实际上,实现所需功能的直接方法是根据复选框的选择重新呈现组合框。这可以通过以下方式完成: 请注意,该代码在Bean中不需要任何特殊字段

  • 问题内容: 我有这个功能: 我的页面使用最喜欢的按钮加载内容,但是在Ajax调用并生成其他新内容后,单击新内容的按钮时该功能不起作用。有什么不对吗? 问题答案: 那是因为您正在使用动态内容。 您需要将点击调用更改为委托方法,例如 要么

  • 问题内容: 我在Linux上开发了我的应用程序,并且AJAX请求工作正常。我已经将应用程序拉到Windows机器上,但是AJAX请求失败,我刚收到403Forbidden错误。从网上看,我认为这是csrf令牌的问题。在Linux中,我可以在AJAX请求的Cookies下看到。我没有在Windows中设置任何cookie。 这是我用来获取csrf cookie的Javascript代码。来自http

  • 问题内容: (使用Chrome 44测试) 所需行为 :发出XHR请求,将结果放入文本区域,选择文本,然后复制到剪贴板。 实际行为 :成功执行XHR请求后,将结果放在文本区域中并选择它,但是无法将结果复制到剪贴板。但是,如果我在XHR回调之外启动副本,则可以正常工作。 示例html页面: 如果按“获取数据并复制文本区域”按钮,则数据已成功获取但未复制。如果按“复制文本区域”按钮,则文本将按预期复制

  • 问题内容: 我有一个Ajax脚本,可以将一些数据发送到外部URL。外部URL托管在同一服务器上,但是域与ajax调用的源不同。 这在Firefox和Chrome中完美运行。但是,在IE中,ajax调用不会通过,并且Return False函数也不起作用(一旦ajax调用失败)。 下面是我的代码: 当我尝试从ajax网址中删除http://时,返回false确实有效。 任何帮助,将不胜感激。谢谢 问