PHPの質問です。

外部ファイルを読み込むための命令は、大まかにfile関数とfopen関数の二つがありますが、以下の命令の場合について教えてください。
以下のコードを書きました
file関数
$d4 = file($filedate);
$d3 = join("",$d4);

fopen関数
$d4 = @fopen($filedate,"r");
while(!feof($d4)){
$d3 .= fgets($d4, 3200);
}
fclose($d4);

要するに$d3にファイルソースをすべて読み込ませたいです。実際にはこれをファイル数分ループさせます。
試してみたところfopenは約6000、fileは約26000読み込めました。
fopen命令はこういった命令には向かないのでしょうか?それとも書き方や読み込むファイルが悪いのでしょうか…
fopenはfileより低メモリでできると書いてあったのですが、この結果からだと間違っているようなのですがどうなのでしょう?

回答の条件
  • 1人2回まで
  • 登録:2008/04/22 11:52:57
  • 終了:2008/04/29 11:55:02

回答(1件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332008/04/22 13:12:03

ポイント60pt

下記のコメントでいただいた情報を含めて回答します。


fopenは約19000ファイルで処理が止まり$d5の結果が表示されず、fileは約26000ファイルで$d5の結果も表示できました

これは、fopen関数の問題というより、whileループを回しているオーバーヘッドがあるために、file関数の場合より少ないファイル数でタイムアウトしてしまったのだと考えられます。


確証はありませんが、file関数を使った場合よりfile_get_contents関数を使った方が、少しだけ読み込み可能なファイル件数が増えるのではないでしょうか。

id:tukihatu

なるほどそっちですか…代わりの命令で上手い方法はないのでしょうか?

今回の例では確かにfileよりはfile_get_contentsがいいですね。

2008/04/22 16:59:31
  • id:tukihatu
    fopenは約19000でした。すいません^^;
  • id:pahoo
    >fopenは約6000、fileは約26000読み込めました
    単位は何ですか? ファイル件数/行数/バイト数?
    もし複数のファイルを読み込んでいるとしたら、全ファイルの内容(ソース・テキスト)を$d3に結合しているということですか?
  • id:tukihatu
    >単位は何ですか?
    単位はファイル件数です。
    一つのファイルを$d3に読み込み、いろいろ処理して、結果を$d5配列に出力。その後$d3を初期化して、ファイルを読み込んで…すべての処理が終わったら$d5を一つずつ出力、という流れです。
    カウントは、$d5に出力した後に、$counter++としています。$counterが500ファイルを超えたら文字を出力して、途中で処理が止まってもどこまで読んだかを判定しました。
    タイムアウトは120秒に設定しました。

    その結果、fopenは約19000ファイルで処理が止まり$d5の結果が表示されず、fileは約26000ファイルで$d5の結果も表示できました

    説明不足ですみません。
    よろしくお願いします!

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません