[PHP] feof と無限ループ : してログ

[PHP] feof と無限ループ

PHP 2014314

単純なバイナリファイルの読み込みだけど、fopen、feof、fread、fclose を使った至ってシンプルな下記のようなコードは危険だ。

$fp = fopen('binary/file/path' ,'rb');
while (!feof($fp)) {
	echo fread($fp,8192);
}
fclose($fp);

これはだいたい上手くいくが、無限ループの危険をはらんでいる。 そのシナリオは、まず、fopen が失敗して $fp に false が入る。 次に、ループ条件が評価され、feof は無効なファイルポインタに対して false を返してしまう。 feof はファイルの終端に達しているかを論理値で返すため、終端でないの意の false と区別がつかない。 従って、無効なファイルポインタを渡されたループは、ファイルをまだ読み終わってないとして、延々と空回りしてしまうことになる。

これを避けるには、ファイルポインタが有効かどうかの判断を加えれば良く、単純に下記のようなコードで良い。 変わったのは、while のループ条件にファイルポインタ自体を加えただけで、ファイルポインタが無効なときは無限ループを回避する。

$fp = fopen('binary/file/path' ,'rb');
while ($fp && !feof($fp)) {
	echo fread($fp,8192);
}
fclose($fp);

なお、ファイルポインタがデータベースの問い合わせで得たバイナリ型のものであってもこれで良さそうだ。 比較関係では書き方や関数があるので、一度ここらへんを見て勉強しておこうと思う。 今更だけれど。

0 件のコメント
名前:
コメント: