LINUX などには「tail コマンド」というものがあって、これはファイルの後ろから数行を表示するものであります。
ログファイルなどは膨大な量になることがあり、テキストエディタなどで開くと開くのに時間がかかったり、最終行までスクロールするのが面倒だったりします。ただ、スクロールはエディタによってはコマンドひとつで最終行にいけるものもあります。
需要があるかどうかはわからないが、自分が使ってみたかったので、「tail コマンド」のようにファイルの後ろから数行を表示するプログラムを作ってみました。ファイルの内容を最終行から順に表示する方法も示しております。
ファイルの内容の後ろから数行を表示する
$line_num = 10; // 表示する行数
$contents = file('log.txt', FILE_IGNORE_NEW_LINES);
$start_index = count($contents) - $line_num;
if ( $start_index < 0) {
$start_index = 0;
}
for ( $i=$start_line; $i<count($contents); $i++ ) {
echo $contents[$i] . '<br />';
}
プログラム解説
$line_num = 10;
この部分では表示する行数を指定しております。とりあえず、「tail コマンド」のデフォルトと同じ10行にしておきます。
file 関数はファイルを読み込んで、配列に格納して返却します。
第1引数は読み込みたいファイルのパスを指定、第2引数は指定しなくても動作しますが、「FILE_IGNORE_NEW_LINES」という定数を指定した場合、配列の各要素の最後に改行文字を追加しません。これを指定することでファイルの末尾が改行のみだった場合、取り除いてくれます。
count 関数で配列の数を取得することができますが、file 関数で読み込んだファイルの行数と同数になります。ちなみに、sizeof 関数でも取得することができます。
$start_index = count($contents) - $line_num;
ファイルの行数から、表示する行数(今回は10)を引いて、「表示を開始する配列上の位置」を取得しております。
if ( $start_index < 0) {
$start_index = 0;
}
ファイルが10行に満たない場合はマイナスの値になってしまうので、その場合は配列の最初である0を指定します。
for ( $i=$start_line; $i<count($contents); $i++ ) {
echo $contents[$i] . '<br />';
}
最後にfor 文で回して、算出した「表示を開始する配列上の位置」から配列の最後までを表示しております。
ファイルの内容を最終行から表示する
仮にファイルの後ろから順に表示させたい場合は、プログラムの最後の部分を次のように修正します。
for ($i = count($contents)-1; $i >= 0; $i--) {
echo $contents[$i] . '<br />';
}
読み込むファイルの内容:
aaa
bbb
ccc
ddd
eee
実行結果:
eee
ddd
ccc
bbb
aaa
まとめ
PHPでファイル内容を最終行から表示するサンプルプログラムについて解説してきましたが、いかがでしたでしょうか。
需要があるかどうかわかりませんが、デバッグでログを確認する際に、いちいちテキストエディタを開き直して最終行までスクロールする必要がないので、個人的には便利かと思います。
コメント