PHP で大容量ファイルを一行ずつ読み込む方法
-
PHP で大容量ファイルを一行ずつ読み込むには
fgets()
関数を使用する -
PHP で大容量ファイルを一行ずつ読み込むには
file()
関数を使用する -
stream_get_line()
関数を使って PHP で大容量ファイルを一行ずつ読み込む
この記事では、PHP で大容量ファイルを一行ずつ読み込む方法を紹介します。
fgets()
関数を使用するfile()
関数を使用するstream_get_line()
関数を使用する
PHP で大容量ファイルを一行ずつ読み込むには fgets()
関数を使用する
組み込み関数 fgets()
は、開いているファイルから一行ずつ読み込んでくれる。この関数を使って、大きなファイルを一行ずつ読み込むことができます。この関数を使用するための正しい構文は以下の通りです。
fgets($fileName, $lengthOfFile);
関数 fgets()
は 2つのパラメータを持ちます。パラメータの詳細は以下の通りです。
パラメータ | 説明 | |
---|---|---|
$fileName |
必須 | 1 行ずつ読み込んでいきたいファイルです。 |
$lengthOfFile |
オプション | 読み込むファイルの長さを指定します。デフォルト値は 1024 バイトです。 |
この関数は正常ならば、ユーザが指定したファイルから lengthOfFile -1
の string
を返します。失敗した場合は False
を返します。
以下のプログラムは、fgets()
関数を用いて大容量ファイルを 1 行ずつ読み込む方法を示しています。ここでは、fopen()
と fclose()
関数を用いて、それぞれファイルを開き、閉じることにします。花の詳細が書かれた flowers.txt
という名前のテキストファイルがあります。
<?php
if ($file = fopen("flowers.txt", "r")) {
while(!feof($file)) {
$line = fgets($file);
echo ("$line");
}
fclose($file);
}
?>
このファイルを最後まで読み込むには、feof()
関数を利用しています。出力は、ファイルを一行ずつ読み込んだ内容を示しています。
出力:
PHP で大容量ファイルを一行ずつ読み込むには file()
関数を使用する
PHP では、file()
関数を使ってファイルを一行ずつ読み込むこともできます。関数 file()
はファイルを一行ずつ配列に読み込みます。この関数を使用するための正しい構文は以下の通りです。
file($fileName, $flags, $context)
関数 file()
は 3つのパラメータを受け付ける。パラメータの詳細は以下の通りです。
パラメータ | 説明 | |
---|---|---|
$fileName |
必須 | これはファイルが保存されているパスです。 |
$flags |
オプション | この関数のフラグとして使用できる定数について書かれています。これを読むにはここを参照してください。 |
$context |
オプション | stream_context_create()関数を使って作成できるリソースです。 |
そのファイルを file()
関数を使って読み込むプログラムは以下のようになります。
<?php
foreach(file('flowers.txt') as $line) {
echo $line. "\n";
}
?>
stream_get_line()
関数を使って PHP で大容量ファイルを一行ずつ読み込む
また、ファイルを一行ずつ読み込むには、stream_get_line()
関数を使用することもできます。この関数はデリミタまでのファイルを読み込みます。この関数を使用するための正しい構文は以下の通りです。
stream_get_line($handle, $length, $ending)
関数 stream_get_line()
は 3つのパラメータを受け付けます。パラメータの詳細は以下の通りです。
パラメータ | 説明 | |
---|---|---|
$handle |
必須 | これはファイルが保存されているパスです。 |
$length |
必須 | 読み込まれるファイルの長さを伝えます。 |
$ending |
必須 | これはデリミタを表す文字列です。 |
関数 stream_get_line()
を用いてファイルを読み込むプログラムは以下の通りです。
<?php
$file = fopen("flowers.txt", "r+");
while ($line = stream_get_line($file, 1024 * 1024, ".")) {
echo $line;
}
fclose($file);
?>
出力:
.
は出力から削除されます。