3

$.postによって jQueryが中止されたときに、PHP スクリプトの実行を停止しようとしていabort()ます。基本的に、ユーザーが入力フィールドを変更するたびに、 に$.postヒットする必要がありtest.phpます。最初の要求が戻る前に 2 番目の入力が変更された場合、$.postは中止され、新しい入力が送信されます。これが発生したときにPHPの実行を停止したい。

接続処理に関するPHPマニュアルによると:

connection_status() は、クライアントが (STOP ボタンで) 正常に切断した場合にのみ、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 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);
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 に答える