【问题标题】:Abort php script execution when jquery ajax is aborted中止jquery ajax时中止php脚本执行
【发布时间】:2013-09-10 23:03:55
【问题描述】:

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

根据PHP manual on connection handlnig

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

在使用xhr.abort() 时,无论如何要发送RST TCP 吗?

为了确保我已经在 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);

【问题讨论】:

  • 你解决了吗?
  • @poletaew According to the php docs “但是,默认行为是当远程客户端断开连接时,您的脚本会中止。”虽然我很难验证这是实践。
  • 这是一个谎言......要么 jquery 没有向服务器发出用户中止的信号,要么 php 完全忽略了它。

标签: php javascript jquery ajax apache


【解决方案1】:

这可能会有所帮助:

注意事项

在尝试向客户端发送信息之前,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);
}

【讨论】:

  • 尝试重写。仍然没有工作。所有文件大小相同。直接在浏览器中访问地址并按下停止按钮也不起作用。
猜你喜欢
  • 1970-01-01
  • 2011-12-19
  • 2016-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-15
相关资源
最近更新 更多