プログラムとデザイン(html)の部分を分ける為に、以下のようにしました。
// ファイルからデータを取得
$fp = fopen("log.txt","r");
$i=0;
while(!feof($fp)){
// ファイルから1行読み込み
$line = fgets($fp,1000);
// タブ区切りを配列にする
$array = explode("\t",$line);
// 表示用の配列に代入
$list[$i]["date"] = $array[0];
$list[$i]["ua"] = $array[1];
$list[$i]["host"] = $array[2];
$i++;
}
// 表示用
<?php for($i=0;$i<10;$i++){?>
<tr>
<td><?=$list[$i]["date"]?></td>
<td><?=$list[$i]["ua"]?></td>
<td><?=$list[$i]["host"]?></td>
</tr>
<?php }?>
※繰り返し箇所のみ掲載
しかし、上記の方法だと1万行の処理をするのに2~3秒の時間を要します。
一旦配列に代入しているので時間がかかるのは分かるのですが、
もしかしたら自分の書き方・考え方が間違っているのではないか?と思っています。
他に良い方法がありましたら、アドバイスいただければと思います。
※あくまでPHPとテキストファイルを使った上での実験ですので、DBを利用するという代替案は無しでお願いします。
※PHPは5.2.6を使っています。
上記の方法だと1万行の処理をするのに2~3秒の時間を要します
ご質問のソースを、前半の(a)データ取り込み部分、と後半の(b)表示部分に分けます。
(a)だけで2~3秒かかっていますか? であれば、サーバのスペックなどをお知らせいただけますか。
一般的には、(b)の処理――というより、(b)の部分をブラウザで表示させるのに圧倒的に時間がかかります。
とくに table タグは、ブラウザの表示処理に時間がかかります。
本当にブラウザ表示する必要があるのかどうか疑問なのですが‥‥まずは、(a),(b)のどちらに時間がかかっているのかご確認ください。
特に考え方は間違っていないと思います。
一万行の処理をすれば、それ相応に時間もかかります。普通に2~3秒ぐらいはかかってしまうと思います。
基本的にメモリ依存なので。
それでもこれ以上早くしたいのなら、質問文に書いてあるとおり配列に代入するのをやめて直接その場で出力するぐらいしかないかと。
または、データの形式を変えるなど。(explodeしなくてもいいような仕組み、保存法を考えるとか)
最初の部分を全部消してから // 表示用 <?php $fp = fopen("log.txt","r"); $i=0; while(!feof($fp)){ // ファイルから1行読み込み $line = fgets($fp,1000); // タブ区切りを配列にする $array = explode("\t",$line); ?> <tr> <td><?=$array[0]?></td> <td><?=$array[1]?></td> <td><?=$array[2]?></td> </tr> <?php }?>
こんな感じ
確かにこれならばメモリをすぐ解放できるし、いくらか速くなるとは思いますが…
それでも2秒はかかると思いますよ。
ちなみにどちらの方法でも、あまり多い処理をすると、whileのタイムエラーで処理が止まる可能性があります。
UNIX系サーバならコマンドで動かすと早いと乗っています。
そうですね。やはり直接書くしかないですね‥。直接書いた場合は、私の環境では一瞬(1秒以内)でした。
使い勝手はDBよりテキストファイルの方が良いので実験していたのですが、処理面で制約があるので、大きいファイルを操作する場合は、DBに移行した方が良いかもしれません。
回答ありがとうございました。
aに時間がかかっています。配列($list)に代入する箇所をコメントアウトすると、瞬時に表示されます。
また、$listに代入している目的を書かないとご指摘を受けると思い書いた次第ですが、後半のB(HTMLに表示する箇所)を出力する・しない場合でも同じぐらい動作に時間がかかります。
テストしたサーバスペックはCore2Duo 1.83GHzの2GBですが、サーバスペックの問題ではないと思います。さくらやXREAなどのレンタルサーバで試した時も同じぐらいこの書き方だと遅いです。
あと、質問や記入漏れがある場合はコメント欄にいただけないでしょうか。