更新时间:2023-12-05 10:05:22
这可以帮助:
注
PHP将无法检测到用户已经中止的连接直到试图将信息发送到客户端。只需用echo语句不保证该信息发送,请参阅的flush()一>
和也: http://www.php.net/manual /en/function.connection-aborted.php
也许有点重写将帮助:
ignore_user_abort(假);
为($ i = 0; $ I&4;; $ I ++){
使用ob_flush();
冲洗();
如果(connection_aborted()){
回声\ r \ñ\ r \ N的;
使用ob_flush();
冲洗();
出口;
}
file_put_contents($ _ SERVER ['DOCUMENT_ROOT']'/测试/测试($ I + 1).LOG,1 \ r \ N,FILE_APPEND。);
睡眠(1);
}
I'm looking to stop the execution of a PHP script when the jQuery $.post
is aborted by abort()
. Basically whenever a user changes any input field the $.post
should hit the test.php
. If a second input is changed before the first request returns, the $.post
is aborted and a new one is sent. I want PHP to stop execution when this happens.
According to PHP manual on connection handlnig :
connection_status() return ABORTED state ONLY if the client disconnects gracefully (with STOP button). In this case the browser send the RST TCP packet that notify PHP the connection is closed.
Is there anyway to send the RST TCP
when using xhr.abort()
?
To make sure I've tested this in the the test.php
file. Theoretically if the script is stopped the files should have different sizes and number of lines in them. But they're all the same. So the script is not aborting.
jQuery main file:
var xhr = false;
$('input').on('change', function(){
if(xhr){
xhr.abort();
}
xhr = $.post('/test.php', this.value, function(b64){
xhr = false;
});
});
PHP test.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);
This may help:
Notes
PHP will not detect that the user has aborted the connection until an attempt is made to send information to the client. Simply using an echo statement does not guarantee that information is sent, see flush().
And also: http://www.php.net/manual/en/function.connection-aborted.php
Maybe a little re-write would help:
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);
}