connection_aborted()不能在Ajax调用工作(connection_aborted

2019-07-30 13:45发布

EDITED

我有一个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, 即使我发出明确的字符串,并刷新缓冲区!

有没有人有答案在这里吗?

Answer 1:

您将需要添加“ignore_user_abort(真正的);” 在PHP脚本的顶部,并呼吁“使用ob_flush()”相呼应,从脚本的东西后(为什么看到PHP冲水()手册页 )。 工作示例(概念验证):

<?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()(请刷新阅读()手册页,上面的链接,并从回答这个话题 ),否则可能无法正常工作,这取决于服务器/ PHP配置。 下面的代码在WAMP测试用PHP 5.3.8(不调用工作的flush()),现在在Ubuntu用PHP 5.3.10。 其中使用ob_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


文章来源: connection_aborted() does not work on ajax calls