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 を使えばいいんじゃないかと思います。
間違ってたら、ご指摘いただけると助かります。