PHP でファイルを読み取る正しい方法
PHP のさまざまなファイル関数の使用方法を学びます。 fopen、fclose、feof などの基本的なファイル関数を確認し、fgets、fgetss、fscanf などの読み取り関数について学習します。そして、1 行または 2 行のコードでファイル全体を処理する関数を見つけました。
何通りあるのか数えてみましょう
で
PHP のような最新のプログラミング言語を使用する楽しみの 1 つは、利用可能なオプションが膨大にあることです。 PHP は Perl のモットーである「以上のものがある」を簡単に勝ち取ることができます。
一つの方法
特にファイル処理に関しては、それを実行します (方法は 1 つだけではありません)。しかし、非常に多くのオプションが利用できるため、その作業に最適なツールはどれでしょうか? もちろん、実際の答えはファイルの目的を解析することによって異なります。
したがって、時間をかけてすべてのオプションを検討する価値があります。
伝統的な fopen メソッド
フォーペン
メソッドは古い C および C++ である可能性があります
プログラマーが最もよく知っている言語は、これらの言語を使用したことがある場合、多かれ少なかれ何年も自由に使えるツールだからです。これらのメソッドのいずれについても、次を使用します。
リスト 1 に示すように、fopen (データの読み取りに使用される関数) の標準メソッドはファイルを開いてから、fclose を使用してファイルを閉じます。
リスト 1. fgets でファイルを開いて読み取る ???
$file_handle = fopen("myfile", "r");
while (!feof($file_handle)) {
?? $line = fgets($file_handle);
?? エコー $line;
}
fclose($file_handle);
長年のプログラミング経験を持つほとんどのプログラマーはこれらの関数に精通していますが、詳しく説明してみましょう。次の手順を効果的に実行します:
ファイルを開きます。 $file_handle には、ファイル自体への参照が保存されます。
ファイルの最後に到達したかどうかを確認してください。
ファイルの終わりに達するまでファイルの読み取りを続け、読み取られた各行を出力します。
ファイルを閉じます。
これらの手順を念頭に置いて、ここで使用される各ファイル関数を確認していきます。
fopen
fopen 関数はファイルへの接続を作成します。 「接続を作成する」と言ったのは、fopen はファイルを開くだけでなく、URL も開くことができるためです。 $fh = fopen("http://127.0.0.1/", "r");
このコード行は上記のページへの接続を作成し、ローカル ファイルのようにページの読み取りを開始できるようにします。
注: fopen で「r」を使用すると、ファイルが読み取り専用で開かれることを示します。ファイルへのデータの書き込みはこの記事の範囲外であるため、その他のオプションはすべてリストしません。ただし、クロスプラットフォーム互換性のためにバイナリ ファイルから読み取る場合は、「r」を「rb」に変更する必要があります。この例については後で説明します。
フェオ
feof コマンドは、ファイルの終わりに到達したかどうかを検出し、True または False を返します。リスト 1 のループは、ファイル「myfile」の終わりに到達するまで続きます。注: URL の読み取り中に、読み取るデータがなくなってソケットがタイムアウトした場合にも、feof は False を返します。
fclose
リスト 1 の最後まで進んで、fclose は fopen の逆を行い、ファイルまたは URL への接続を閉じます。この関数を実行すると、ファイルまたはソケットから情報を読み取ることができなくなります。
fgets
リスト 1 の数行戻ると、ファイル処理の核心、つまり実際にファイルを読み取る作業に移ります。 fgets 関数は、最初の例で使用する武器です。ファイルからデータ行を抽出し、それを文字列として返します。その後、データを印刷したり、その他の方法で操作したりできます。リスト 1 の例では、ファイル全体が正常に出力されます。
処理されるデータのチャンクのサイズを制限する場合は、fgets にパラメーターを追加して、行の最大長を制限できます。たとえば、行の長さを 80 文字に制限するには、次のコードを使用します: $string = fgets($file_handle, 81);
思い出してください。」
恐怖
複数のファイル読み込み関数の中で利用できる関数は fgets 関数だけです。通常、行ごとに解析することが合理的であるため、これはより一般的に使用される関数です。実際、他のいくつかの関数も同様の機能を提供します。ただし、必ずしも 1 行ずつ解析する必要があるわけではありません。
これ
フレッドを使用する必要があります。 fread 関数と fgets
の処理目標は少し異なります。バイナリ ファイル (つまり、主に人間が読めるテキストを含まないファイル) から情報を読み取る傾向があります。 「行」の概念はバイナリ ファイル (通常は論理データ構造) とは関係がないため、
は改行で終了しないため)、読み込む必要があるバイト数を指定する必要があります。 $fh = fopen("myfile", "rb");
$data = fread($file_handle, 4096);
??? バイナリデータを使用します
注記
注: この関数の例では、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 ファイル ???
???
「あなたに痛みを与えてくれる人は誰もいないから」の意味がわかったら
?????????? ということは、アメリカというバンドを聴きすぎているということです
???