3

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 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);
HoldOffHunger
  • 18,769
  • 10
  • 104
  • 133
Adam Merrifield
  • 10,307
  • 4
  • 41
  • 58
  • Have you solved this? – poletaew May 17 '17 at 17:16
  • @poletaew [According to the php docs](https://secure.php.net/manual/en/features.connection-handling.php) "The default behaviour is however for your script to be aborted when the remote client disconnects." Though i've had a difficult time validating this is practice. – Adam Merrifield May 18 '17 at 19:35
  • this is a lie... either jquery is not signaling to the server that the user aborted or php is ignoring it completely. – Alexandre Martini Jun 03 '18 at 15:30

1 Answers1

0

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);
}
Adam Merrifield
  • 10,307
  • 4
  • 41
  • 58
John Josef
  • 314
  • 2
  • 5
  • Tried your re-write. Still didn't work. All files are the same size. Doesn't work going to the address directly in the browser and pressing the stop button either. – Adam Merrifield Sep 06 '13 at 19:28