2

そこで、私は自分で小さな実験を行っています。これは、phpエラーのログファイルを(SplFileObjectを使用して)読み取り、ブラウザーでフォーマットして出力するためのスクリプトです。

私はそれを逆の順序で表示する方が論理的ですが(最新のエラーが一番上にあります)。「通常の」順序を使用するには、各行を表示して$ file-> next();を呼び出します。ポインタを移動するために、しかし私はそれを逆にやっていて、私が知る限りprev()またはメソッドがないので、私が見つけた唯一の方法は使用することでした:previous()seek()

for($i = $lines_total - $start_at; $i > $lines_total - $start_at - $lines_to_get; $i--){
    $content->seek($i);
    $data = $content->current();
    if(empty($data)){
        continue;
    }
}

しかし、これは信じられないほど遅いです(16MBのファイルの場合は約7秒)。私が通常の順序でそれをするならば、それは即座です。

誰かが方法を知っていますか?または私がやろうとしていることはクレイジーですか?xD私はコーディングを余儀なくされたデザイナーなので、ポインターなどにはあまり詳しくありません。

4

3 に答える 3

2

将来誰かがこの問題に遭遇した場合に備えて、私は非常に簡単な解決策を思いつきました:

//get to the last position of the file and get the pointer position.
$content->seek($content->getSize());
$lines_total = $content->key();
$byte = $content->ftell();

//all the line in the php error log starts like: [21-Feb-2013 22:34:53 UTC] so...
$pattern = '/^\[.*\]/';

for(...){
//get the current output to preg_match it
    $data = $content->current();

//go backward each time it doesnt match a line's start
    while ( preg_match( $pattern, $data ) === 0 ){
    $byte--;
    $content->fseek($byte);
    $data = $content->current();
    }

//go backward 1 more position to start the next loop
    $byte--;
    $content->fseek($byte);
}

これがいつか誰かに役立つことを願っていますxD

于 2013-02-21T13:08:58.000 に答える
0

これは古い質問ですが、SplFileObj を使用する最も簡単な方法は、キーとシークを使用することです。

public function prev(){
    $key = $this->_splFileObj->key();
    if( $key ){
        --$key;
    }
    $this->_splFileObj->seek($key);
}

このメソッドが のプロパティを持つ SplFileObj のラッパーにあると仮定します_splFileObj

于 2015-01-14T19:05:26.613 に答える