PHP のさまざまなファイル関数の使用方法を学びます。 fopen、fclose、feof などの基本的なファイル関数を確認し、fgets、fgetss、fscanf などの読み取り関数について学習します。そして、1 行または 2 行のコードでファイル全体を処理する関数を見つけました。
方法が何通りあるか数えてみましょう
PHP のような最新のプログラミング言語を使用する楽しみの 1 つは、利用可能なオプションが膨大にあることです。特にファイル処理に関しては、PHP は Perl のモットーである「方法は複数ある」を簡単に勝ち取ります。しかし、非常に多くのオプションが利用可能であるため、その作業に最適なツールはどれでしょうか?もちろん、実際の答えはファイル解析の目的によって異なるため、時間をかけてすべてのオプションを検討する価値があります。
伝統的な fopen メソッド
fopen メソッドは、元 C および C++ プログラマーにとっておそらく最もよく知られているものです。なぜなら、これらの言語を使用したことがあれば、それらは多かれ少なかれ何年も自由に使えるツールだからです。これらの方法のいずれでも、リスト 1 に示すように、ファイルは fopen (データの読み取りに使用される関数) を使用する標準的な方法で開かれ、その後 fclose を使用して閉じられます。
リスト 1. fgets を使用してファイルを開いて読み取る
$file_handle = fopen("myfile", "r");
while (!feof($file_handle)) {
$line = fgets($file_handle);
echo $line;
}
fclose($file_handle);
長年のプログラミング経験を持つほとんどのプログラマーはこれらの関数に精通していますが、詳しく説明してみましょう。次の手順を効果的に実行します:
ファイルを開きます。 $file_handle には、ファイル自体への参照が保存されます。
ファイルの最後に到達したかどうかを確認してください。
ファイルの終わりに達するまでファイルの読み取りを続け、読み取られた各行を出力します。
ファイルを閉じます。
これらの手順を念頭に置いて、ここで使用されるすべてのファイル関数を確認していきます。
fopen
fopen 関数はファイルへの接続を作成します。 「接続を作成する」と言ったのは、fopen はファイルを開くだけでなく、URL も開くことができるからです: $fh = fopen("http://127.0.0.1/", "r");
この行のコードにより、上記のページへの接続が作成され、ローカル ファイルであるかのように読み取りを開始できるようになります。
注: fopen で使用される「r」は、ファイルを読み取り専用で開くように指示します。ファイルへのデータの書き込みはこの記事の範囲外であるため、その他のオプションはすべてリストしません。ただし、クロスプラットフォーム互換性のためにバイナリ ファイルから読み取る場合は、「r」を「rb」に変更する必要があります。この例については後で説明します。
feof
feof コマンドは、ファイルの終わりに到達したかどうかを検出し、True または False を返します。リスト 1 のループは、ファイル「myfile」の終わりに到達するまで続きます。注: URL の読み取り中に、読み取るデータがなくなってソケットがタイムアウトした場合にも、feof は False を返します。
fclose
リスト 1 の最後までスキップすると、fclose は fopen の逆を行い、ファイルまたは URL への接続を閉じます。この関数を実行すると、ファイルまたはソケットから情報を読み取ることができなくなります。
fgets
リスト 1 の数行前に戻ると、ファイル処理の核心、つまり実際にファイルを読み取ることができます。 fgets 関数は、最初の例で使用する武器です。ファイルからデータ行を抽出し、文字列として返します。その後、データを印刷したり、その他の方法で操作したりできます。リスト 1 の例では、ファイル全体が正常に出力されます。
処理されるデータチャンクのサイズを制限する場合は、fgets にパラメータを追加して行の最大長を制限できます。たとえば、行の長さを 80 文字に制限するには、次のコードを使用します。 $string = fgets($file_handle, 81);
「」を思い出してください。注: この関数の例では、fopen とは若干異なるパラメーターがすでに使用されています。バイナリ データを扱うときは、常に fopen に b オプションを含めることを忘れないでください。この点をスキップすると、Microsoft® Windows® システムでは改行の処理方法が異なるため、ファイルが正しく処理されない可能性があります。 Linux® システム (または他の UNIX® バリアント) を扱っている場合、これは重要ではないように思えるかもしれません。ただし、Windows 用に開発していない場合でも、そうすることでクロスプラットフォームの保守性が向上するため、従うべき良い習慣です。
上記のコードは 4,096 バイト (4 KB) のデータを読み取ります。注: 指定したバイト数に関係なく、fread は 8,192 バイト (8 KB) を超えることはありません。
ファイル サイズが 8 KB 以下であると仮定すると、次のコードはファイル全体を文字列に読み取ることができるはずです。 $fh = fopen("myfile", "rb");
$data = fread($fh, filesize("myfile"));
fclose($fh);
ファイルの長さがこの値より大きい場合、ループを使用して残りを読み取ることしかできません。
fscanf
文字列処理に戻ると、fscanf も従来の C ファイル ライブラリ関数に従います。慣れていない方のために説明すると、fscanf はフィールド データをファイルから変数に読み取ります。 list ($field1, $field2, $field3) = fscanf($fh, "%s %s %s");
この関数で使用される書式文字列は多くの場所 (PHP.net など) に記載されているため、 、ここではこれ以上の詳細は説明しません。文字列の書式設定は非常に柔軟であると言えば十分でしょう。すべてのフィールドが関数の戻り値に配置されることに注意してください。 (C では、これらはすべて引数として渡されます。)
fgetss
fgetss 関数は従来のファイル関数とは異なり、PHP の能力をより深く理解するのに役立ちます。この関数は fgets 関数と同様に機能しますが、見つかった HTML タグまたは PHP タグがすべて削除され、プレーン テキストのみが残ります。以下に示す HTML ファイルを表示します。
リスト 2. サンプル HTML ファイル「Cause there ain't no one for to give you no pain」