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

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!

请问有人在这里回答吗?

解决方法:

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

<?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);
}

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

编辑:

我的错.调用flush()和ob_flush()(请阅读flush()手册页,上面的链接,以及this topic的答案),否则可能不起作用,具体取决于服务器/ 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

相关文章

IE6是一个非常老旧的网页浏览器,虽然现在很少人再使用它,但...
PHP中的count()函数是用来计算数组或容器中元素的个数。这个...
使用 AJAX(Asynchronous JavaScript and XML)技术可以在不...
Ajax(Asynchronous JavaScript and XML)是一种用于改进网页...
本文将介绍如何通过AJAX下载Excel文件流。通过AJAX,我们可以...
Ajax是一种用于客户端和服务器之间的异步通信技术。通过Ajax...