3

ignore_user_abort()の関数ドキュメントの注記セクションでは、データがクライアントに送信されない場合、PHP はユーザーがリクエストを中止したことを検出できないことを示唆しています。これは関数 にも当てはまりconnection_status()ます。残念ながら、出力バッファリングを利用するページでユーザーの中止 (キャンセル可能な ajax リクエスト) を検出する必要があります (そして、それを簡単に変更することはできません)。

関数を使用する以外に、ユーザーのアボートを検出する他の方法はあります connection_status()か? または、その関数が正しい値を返すようにする特定の方法はありますか? FINクライアントからパケットが受信されるため、PHP は要求が中止されたことを実際に認識しているはずです。

接続が中止される前後に、ブロッキングおよびノンブロッキングの方法でデータの読み取り/書き込みを行った後、 、、およびのストリーム メタデータを分析しようとしましたが、有用な状態変化は得られませんでした。php://inputphp://outputphp://stdinphp://stdout

4

1 に答える 1

1

ばかげた提案ですが...flush()出力バッファリングを開始する前に、クライアントにデータを送信してから、データを送信しようとしましたか?私が考えることができる他の唯一の解決策は、バッファをエスケープすることですが、あなたが言ったように、それがいかに厄介であるかを想像することができます。

たぶん、バッファを壊すのを助けるヘルパー...

function OBWanCallback($buffer)
{
    if( OBWan::$isFinished )
    {
        // -- Actual callbacks go here ...
    }

   return $buffer;
}

OBWan::startbuffer('OBWanCallback');
[ // -- Example functionality
    self::$callback = $callback;
    ob_start(self::$callback);
]

// -- in some code far, far away ...

OBWan::suspendbuffer();
[ // -- Example functionality
    self::$buffercache = ob_get_clean();
]

echo " ";
flush();

OBWan::resumebuffer();
[ // -- Example functionality
    ob_start(self::$callback);
    echo self::$buffercache;
    self::$buffercache = "";
]

// -- in some code far, far away ...

OBWan::outputbuffer();
[
    self::$isFinished = true;
    return ob_get_clean();
]

深さを実装している場合は、実装したバッファの深さを説明するための何かを使用します。

于 2011-03-11T14:02:02.277 に答える