かきスタンプ

福岡でフリーランスの物流系のエンジニアやってます。

PHP:ファイルを読み込む関数の使い分け(file, fopen, readfile, file_get_contents)

PHP:ファイルを読み込む関数の使い分け(file, fopen, readfile, file_get_contents)

PHPでファイルを読み込むビルトイン関数は、結構色々あります。

  • file
  • fopen
  • readfile
  • file_get_contents

等。

以下の条件によって、使い分けをしていけばよいのではないでしょうか。

  • テキストか、バイナリか
  • ファイルサイズ
  • どんな使い方をするのか

という訳で、以下、各関数について。

file

https://www.php.net/manual/en/function.file.php

テキストファイル限定。(改行コードを区切り文字として使うため。)
すべてを変数(メモリ)に一旦貯めるので、あまりにも大きいファイルの使用には向かない。

ファイルの中身が配列になる。
改行区切りのテキストファイルを扱うのに適している。

使用例
// ファイルの内容を配列に取り込みます。
$file = file(__FILE__);

// 行単位で出力
foreach ($file as $lines => $line) {
    echo "Line #{$line_num} : " . htmlspecialchars($line);
}

fopen

https://www.php.net/manual/ja/function.fopen.php

テキスト・バイナリどちらでも使える。
ファイルの大小に関係なく使用可。

自身で色々制御する際に使う。

使用例
// ファイルを開く(戻り値は、FilePointer と呼ばれる特殊な変数)
$handle = fopen(__FILE__, "r");  // readonly

// ファイル内容を出力
while ($line = fgets($handle)) {
  echo $line;
}
// ファイルポインタをクローズ
fclose($handle);

readfile

https://www.php.net/manual/ja/function.readfile.php

テキスト・バイナリどちらでも使える。
巨大なファイルでも使用可。(詳細は上記リンクを参照)

ファイルの中身をそのまま表示する。
何かしらの制御を加えたいなら、別のを使った方がいいかも。

使用例
readfile(__FILE__);     // コンソールに、このファイルの内容が出てくる

file_get_contens

https://www.php.net/manual/ja/function.file-get-contents.php

テキスト・バイナリどちらでも使える。
file と同じ理由で、あまりにも大きいファイルの使用には向かない。

使用例
$current = file_get_contents(__FILE__);

print_r($current);

引数に URLを使用すると、GETリクエストとして使用可。
というか、そっちの使い方しかしてない人も多いかもしんない。
パラメータ次第で PUTにする・パラメータを渡す・SSLエラーを無視する、といった HTTPリクエストライブラリと同様に使う事が出来なくはない。

その他

xml ファイルを読むときは simplexml_load_file を、
ini ファイルを読むとき parse_ini_file を使えばいいんじゃないかと思います。

間違ってたら、ご指摘いただけると助かります。