アメコミとか映画とか音楽とか猫とか単車とか自転車とか革とか銀とかジーンズとかブーツとか今日喰ったものとか。
昨日ぶんの続き。
まず以下のようなテキストファイルを用意。
1 2 3 4 5 6 7 8 9 0
内容は別になんだって良いのだけど 10 行の内容を持つテキストファイル。ちなみにたぶん関係は無いと思うけど文字コードは Shift-JIS で改行コードは LF。
んでこんな具合の PHP スクリプトを走らせてみんとす。
<?php
// 現在時刻。
echo(date("H:i:s", time()) . "<br />
");
echo("----<br />
");
// file をそのまま foreach にブチ込む。
foreach(file("test.txt") as $ent) {
// キャッシュをクリア。
clearstatcache();
// $ent の内容と、その時点でのファイルの最終アクセス時刻を表示。
echo($ent . " " . date("H:i:s", fileatime("test.txt")) . "<br />
");
// 1 秒待つ。
sleep(1);
}
echo("----<br />
");
// 現在時刻。
echo(date("H:i:s", time()) . "<br />
");
?>
その結果。
20:49:11 ---- 1 20:49:11 2 20:49:11 3 20:49:11 4 20:49:11 5 20:49:11 6 20:49:11 7 20:49:11 8 20:49:11 9 20:49:11 0 20:49:11 ---- 20:49:21
cleastatcache の使い方とかがこれで正しいのか自信は無いけど、とりあえず foreach でループする度にいちいち元のファイルへアクセスしてるという事は無いように思える。じゃあやっぱ最初 file を foreach の引数に入れたら死ヌほど時間が掛かってそのあと一度配列に読み込んでからそれを foreach に入れるようにしたら解決したように思えたのはただの偶然か何かだったのだろうか。なんかその公算が強くなってきた気がする。
良く判んね。
ローカル環境でだけど「sleep を 10 秒ぐらいにして実行してその間に test.txt を削除する」という荒技を試してみたところ、削除した時点から fileatime がエラーになったけど $ent の内容たる「1」「2」「3」...はちゃんと出力された。依って「foreach の引数に直接 file を入れるとループが回る度にいちいち元のファイルを読みに行ってしまう」というのは否定された模様のこと。とりあえず何の解決にもなってないね。