PHPでデータを読み取る正しい方法

WBOY
リリース: 2016-06-13 13:08:03
オリジナル
1188 人が閲覧しました

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 ファイル ???

???私のタイトル
???
???????

「あなたに痛みを与えてくれる人は誰もいないから」の意味がわかったら
?????????? ということは、アメリカというバンドを聴きすぎているということです
???


次に、fgetss 関数を使用してフィルターします。

リスト 3. fgets を使用する ???
$file_handle = fopen("myfile", "r");
while (!feof($file_handle)) {
?? echo = fgetss($file_handle);
}
fclose($file_handle);



出力は次のとおりです: ??? 私のタイトル

???????「あなたに痛みを与えてくれる人は誰もいないから」が理解できたら
?????????? つまり、アメリカというバンドを聴きすぎます



fpassthru 関数

ファイルの読み取り方法に関係なく、fpassthru を使用して残りのデータを標準出力チャネルにダンプできます。 fpassthru($fh);


また、この関数はデータを出力するため、データを取得するために変数を使用する必要はありません。

非線形ファイル処理: アクセスをスキップ

もちろん、上記の関数ではファイルの順次読み取りのみが可能です。より複雑なファイルの場合は、ファイルの別の部分に行ったり来たりする必要がある場合があります。ここで fseek が役に立ちます。 fseek($fh, 0);


上の例では、ファイルの先頭に戻ります。完全に返す必要がない場合は、キロバイトを返すように設定できます。次のように記述できます: fseek($fh, 1024);


PHP V4.0 以降では、追加のオプションがいくつかあります。たとえば、現在位置から 100 バイト前にジャンプする必要がある場合は、 fseek($fh, 100, SEEK_CUR);


を使用してみてください。 同様に、次のコードを使用して 100 バイト前にジャンプできます: fseek($fh, -100, SEEK_CUR);


ファイルの終わりの 100 バイト前に戻る必要がある場合は、SEEK_END を使用する必要があります。 fseek($fh, -100, SEEK_END);


新しい場所に到達したら、fgets、fscanf、またはその他の方法を使用してデータを読み取ることができます。

注: URL を参照するファイル処理では fseek を使用できません。


ファイル全体を抽出

今 ここで、PHP のよりユニークなファイル処理機能のいくつかについて触れます。それは、大きなデータの塊を 1 行または 2 行で処理することです。たとえば、ファイルを抽出してその内容全体を Web ページに表示するにはどうすればよいでしょうか?わかりました、わかりました ループを使用した fgets の例。しかし、どうすればこのプロセスを簡単にできるでしょうか? fgetcontentを使用する このメソッドはファイル全体を文字列に入れるため、プロセスが非常に簡単になります。 $my_file = file_get_contents("myfilename");
echo $my_file;


これはベストプラクティスではありませんが、このコマンドは次のように簡潔に記述することができます: echo file_get_contents("myfilename");

この記事ではローカル ファイルの操作に焦点を当てていますが、これらの関数を使用して他の Web ページを抽出、エコー、解析することもできることに注意してください。 echo file_get_contents("http://127.0.0.1/");

このコマンドは次と同等です: $fh = fopen("http://127.0.0.1/", "r");
fpassthru($fh);


このコマンドを見て、「それでも大変すぎる」と思うはずです。PHP 開発者もあなたに同意します。したがって、上記のコマンドは次のように短縮できます: readfile("http://127.0.0.1/");

readfile 関数は、ファイルまたは Web ページの内容全体をデフォルトの出力バッファにダンプします。デフォルトでは、このコマンドは失敗するとエラー メッセージを出力します。この動作を回避するには (必要に応じて) @readfile("http://127.0.0.1/");

を試してください。 いつ ただし、本当にファイルを解析する必要がある場合、file_get_contents によって返される単一の文字列は少し圧倒される可能性があります。最初の反応は、split() を使用することかもしれません。 関数はそれを少し分解します。 $array = split("n", file_get_contents("myfile"));

しかし、これを自動的に実行してくれる優れた関数がすでに存在するのに、なぜこのような苦労をするのでしょうか? PHP の file() 関数はこれを 1 ステップで実行し、行に分割された文字列の配列を返します。 $array = file("myfile");

上記の 2 つの例にはわずかな違いがあることに注意してください。 Split コマンドは新しい行を削除しますが、file コマンドを使用する場合 (fgets コマンドと同様)、配列内の文字列に新しい行が追加されたままになります。

ただし、PHP の威力はそれをはるかに超えています。 parse_ini_file を使用すると、1 つのコマンドで PHP スタイルの .ini ファイル全体を解析できます。 parse_ini_file コマンドは、リスト 4 に示すようなファイルを受け入れます。

リスト 4. サンプル .ini ファイル ??? ; コメント
【個人情報】
名前 = "アーサー王"
クエスト = 聖杯を求めること
好きな色 = ブルー

[その他]
サミュエル・クレメンス = マーク・トウェイン
キャリン・ジョンソン = ウーピー・ゴールドバーグ

次のコマンドは、このファイルを配列にダンプし、その配列を出力します: $file_array = parse_ini_file("holy_grail.ini");
print_r $file_array;

次の出力が結果です:

リスト 5. 出力 ???
配列
(
??? [名前] => アーサー王
??? [クエスト] => 聖杯を探すために
??? [好きな色] => ??? [サミュエル・クレメンス] => マーク・トウェイン
??? [キャリン ジョンソン] => ウーピー ゴールドバーグ
)

いつ ただし、このコマンドによりさまざまな部分がマージされることに気づくかもしれません。これはデフォルトの動作ですが、2 番目の引数を parse_ini_file に渡すことで変更できます。 これを簡単に修正するには、ブール変数である process_sections を使用します。 process_sections を True に設定します。 $ファイル配列 = parse_ini_file("holy_grail.ini", true);
print_r $file_array;

次の出力が得られます:

リスト 6. 出力 ???
配列
(
??? [個人情報] => ??????? (
??????????[名前] => アーサー王
??????????[クエスト] => 聖杯を探すために
??????????【好きな色】 => ブルー
??????)

??? [その他] => 配列
??????? (
??????????[サミュエル・クレメンス] =>マーク・トウェイン
??????????[キャリン ジョンソン] => ウーピー ゴールドバーグ
??????)

)

PHP はデータを、簡単に解析できる多次元配列に入れます。

右 これは、PHP ファイル処理に関しては氷山の一角にすぎません。これには、tidy_parse_file や xml_parse などのより複雑な関数が役立ちます。 HTML および XML ドキュメント。これらの特別な関数の使用法の詳細については、を参照してください。 参考文献。これらの種類のファイルを扱う場合は、これらのリファレンスを参照する価値がありますが、この記事で説明した、遭遇する可能性のあるすべてのファイルの種類について深く考えずに、これまで説明したものに対処するためのヒントをいくつか紹介します。 。 関数に関する適切な一般ルール。

ベストプラクティス

プログラム内のすべてが計画どおりに機能するとは決して考えないでください。たとえば、探しているファイルが移動されてしまったらどうなるでしょうか?権限が変更され、その内容を読み取ることができなくなった場合はどうすればよいでしょうか? file_exists と is_readable を使用して、これらの問題を事前に確認できます。

リスト 7. file_exists と is_readable を使用する ??? $filename = "myfile";
if (file_exists($filename) && is_readable ($filename)) {
??? $fh = fopen($ファイル名, "r");
??? # 処理中
??? fclose($fh);
}

ただし、実際には、そのようなコードを使用するのは非常に面倒になる可能性があります。 fopen の戻り値の処理がより簡単かつ正確になります。 if ($fh = fopen($filename, "r")) {
??? # 処理中
??? fclose($fh);
}

fopen は失敗すると False を返すため、ファイルが正常に開かれた場合にのみファイル処理が実行されるようになります。もちろん、ファイルが存在しないか読み取り不可能な場合は、負の戻り値が予想されます。これにより、この検査で発生する可能性のあるすべての問題をチェックできるようになります。さらに、開くのに失敗した場合は、プログラムを終了するか、プログラムにエラー メッセージを表示させることができます。

のように fopen 関数と同様に、file_get_contents、file、および readfile 関数はすべて、ファイルを開くのに失敗した場合、またはファイルの処理が失敗した場合に戻ります。 間違い。 fgets、fgetss、fread、fscanf、および fclose 関数も、エラー時に False を返します。もちろん fclose を除く また、これらの関数の戻り値はすでに処理されている可能性があります。 fclose を使用する場合、ファイル処理が正常に閉じられていなくても何も行われないため、通常は確認する必要はありません。 fclose の戻り値。

それはあなたの選択です

PHP には、ファイルを読み取って解析するための効率的な方法が豊富にあります。ほとんどの場合、fread のような典型的な関数が最良の選択かもしれません。あるいは、readfile がそのタスクに最適な場合には、readfile のシンプルさに惹かれるかもしれません。それは実際に何が行われているかによります。

のように 大量のデータを扱う場合、fscanf はその価値を証明し、split と sprintf を備えた file を使用するよりも優れたパフォーマンスを発揮します。 コマンドの効率が向上しました。逆に、わずかな変更だけで大量のテキストをエコーし​​たい場合は、file、file_get_contents、または readfile を使用します。 の方が適切かもしれません。これは、キャッシュまたは一時的なプロキシ サーバーの作成に PHP を使用する場合に当てはまります。

PHP には、ファイルを操作するためのツールが多数用意されています。これらのツールの詳細を確認し、取り組んでいるプロジェクトにどれが最適であるかを学びましょう。すでに多くのオプションがあるので、それらを活用して PHP でのファイルの操作を楽しんでください。

?

転載元: http://www.ibm.com/developerworks/cn/opensource/os-php-readfiles/index.html

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート