3

$.post当 jQuery中止时,我希望停止执行 PHP 脚本abort()。基本上,每当用户更改任何输入字段时,$.post都应该点击test.php. 如果在第一个请求返回之前更改了第二个输入,则将$.post中止并发送一个新输入。我希望 PHP 在发生这种情况时停止执行。

根据关于连接处理的 PHP 手册

仅当客户端正常断开连接(使用 STOP 按钮)时,connection_status() 才会返回 ABORTED 状态。在这种情况下,浏览器会发送 RST TCP 数据包,通知 PHP 连接已关闭。

有没有RST TCP在使用时发送xhr.abort()

以确保我已经在test.php文件中对此进行了测试。理论上,如果脚本停止,文件应该有不同的大小和行数。但它们都是一样的。所以脚本不会中止。

jQuery主文件:

var xhr = false;
$('input').on('change', function(){
    if(xhr){
        xhr.abort();
    }

    xhr = $.post('/test.php', this.value, function(b64){
        xhr = false;
    });
});

PHP 测试.php

ignore_user_abort(false);
file_put_contents($_SERVER['DOCUMENT_ROOT'].'/test/test1.log', "1\r\n",  FILE_APPEND);
sleep(1);
file_put_contents($_SERVER['DOCUMENT_ROOT'].'/test/test2.log', "1\r\n",  FILE_APPEND);
sleep(1);
file_put_contents($_SERVER['DOCUMENT_ROOT'].'/test/test3.log', "1\r\n",  FILE_APPEND);
sleep(1);
file_put_contents($_SERVER['DOCUMENT_ROOT'].'/test/test4.log', "1\r\n",  FILE_APPEND);
4

1 回答 1

0

这可能会有所帮助:

笔记

在尝试向客户端发送信息之前,PHP 不会检测到用户已中止连接。简单地使用 echo 语句并不能保证发送信息,请参阅flush()

还有:http ://www.php.net/manual/en/function.connection-aborted.php

也许稍微重写会有所帮助:

ignore_user_abort(false);
for($i = 0; $i < 4; $i++) {
  ob_flush();
  flush();
  if(connection_aborted()) {
    echo "\r\n\r\n";
    ob_flush();
    flush();
    exit;
  }
  file_put_contents($_SERVER['DOCUMENT_ROOT'].'/test/test' . ($i+1) . '.log', "1\r\n", FILE_APPEND);
  sleep(1);
}
于 2013-09-06T19:06:28.093 回答