-1

現在、PHP でWebtail -fユーティリティをプログラミングしています。tail.php最後に追加された行を取得するために x ミリ秒ごとに ajax 要求を行う部分は既に完了しています。
今、私は何とか最後に印刷された行が何であったかを追跡する必要があるところまで来ました。クッキーに保存して使用ftellすることも考えましたが、ファイルの先頭で行が切れる場合があるため、これが常に機能するとは限りません。

それを行う方法についてのアイデアはありますか?追加のデータベースなしでそれをやりたいのですが、Cookie/セッションを使用すると、"pointer"データのサイズは小さくなければなりません。

何かわからないことがあれば質問してください。説明するのはそれほど簡単ではありません;-)

4

2 に答える 2

1

私はこれを試していませんが、Prototype などの JS ライブラリを使用して出力の長さを決定し、それを最後の応答の長さと比較してから、適切な位置で文字列を切り取ってそれに応じて動作させることができます。

テストされていない例:

var lastLength;
Ajax.Request('/tail.php', {
    onSuccess: function(data){
        /* this is our callback and data.responseText will contain the raw response from the server */
        var curLength=String(data.responseText).length;
        if(curLength>lastLength) {
            $('myDiv').insert(data.responseText.substr(lastLength)); // append the new part of the string to a DIV with id 'myDiv'  
            lastLength=curLength;
        }
    }
});

なんらかの理由でその解決策が満足できない場合や問題が発生する場合は、tail.php に生データ以外のものを送信させることを試みることができます。代わりに、JSON を使用して、データとともにバイト数を含めることができます。

仮定して

$tailOutput

を使用して、最新の出力が含まれています

echo json_encode(array(
    'tailOutput' => substr($tailOutput, $_REQUEST['tailLength']),
    'curLength'     => strlen($tailOutput)
));

最後の長さ情報を含めてデータをクライアントに送り返し、それに応じて JS コードを適応させます。

var lastLength;
Ajax.Request('/tail.php', {
    parameters: {
        tailLength: lastLength
    },
    onSuccess: function(data){
            var obj=data.responseText.evalJSON(); //convert to json object
            $('myDiv').insert(obj.tailOutput);
            lastLength=obj.curLength;
        }
    }
});
于 2012-10-06T14:10:55.627 に答える
0

これを純粋に PHP で実行したい場合は、クライアント側で AJAX 処理機能がすでに必要な場合はどうすればよいのでしょうが、単にセッション変数を使用できます。

PHPで

$outputToClient=substr($tailOutput, ($_SESSION['lastTailLength']?$_SESSION['lastTailLength']:0));
$_SESSION['lastTailLength']=strlen($tailOutput);
echo $outputToClient;

このようなものが仕事をするはずです。PHP が AJAX リクエストからのセッションを認識しないという問題がある場合 (これらの時間は過ぎ去り、この問題は発生しないはずですが)、サーバーに送信されるたびに ajax リクエストと共に PHPSESSID を送信してみてください。

于 2012-10-06T15:04:15.503 に答える