已编辑
我有一个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确实有效。 任何帮助,将不胜感激。谢谢 问