web-dev-qa-db-ja.com

より速いのは何ですか? file_put_contents(); fopen(); fwrite(); fclose();?

何が良いですか?独自のMySQLログがあるため、約90MBありますが、どちらを使用すべきかわかりません。実行するクエリがあるたびにファイルを開きます。

より速いのは何ですか?

38
genesis

この記事 によれば、fwrite()はsmidgenより高速です。 (サイトが存在しないため、Wayback Machineへのリンク。)

私の推測では、file_put_contents()はとにかくこれら3つのメソッドの単なるラッパーであるため、オーバーヘッドを失うことになります。

[〜#〜] edit [〜#〜]このサイト は同じ情報を持っています。

41
hwrdprkns

この関数は、fopen()、fwrite()、fclose()を連続して呼び出してデータをファイルに書き込むことと同じです。

ドキュメントを確認してください: http://php.net/manual/en/function.file-put-contents.php

ショーン

27
shaunhusain

ユースケースに依存します。 .5 GBを超えるファイルを開いたが、確かにfile()またはfile_get_contents()を使用したくなかった。また、ファイルを読み取る必要があるため、file_put_contentsが機能しませんでした。

読むことなくファイルを追加することに本当に興味があるなら、それはそれほど重要ではありません。ファイル全体をメモリに読み込む(またはメモリからファイル全体を書き込む)場合、同様に実際には問題ではありません。速度の向上は、これまで見てきたように丸め誤差です。

しかし、これらのファイルが巨大な獣に成長することを期待している場合、または特定のファイルの行数の小さなサブセットのみが必要な場合は、fopen(またはSplFileObject 、これはすばらしい)十分に強力です-これらを使用してファイルの途中から読むのは本当に簡単です。


一方、ログを記録しているだけなので、個人的には、appendフラグを付けてfile_put_contentsを使用する方がより明確で簡潔です。二度見なくても、誰もが何が起こっているかを知ることができます。

10
cwallenpoole
  1. 要求内の1つのファイルに対して書き込み操作が1つだけの場合、file_put_contentsは、オープン、書き込み、およびクローズの関数をラップし、fwriteと同じくらい高速であるため、fwriteよりも優れています。
  2. 要求内の1つのファイルに複数の書き込みがある場合、最初にファイルを開く必要があり、次に複数回書き込みます。そのため、fwriteは高速です。しかし、多くの「ファイルを開く」(ulimit -a | grep「ファイルを開く」)がある非常にビジーなシステムの場合、file_put_contentsは、ファイルハンドラをfwriteより短く保つため、より合理的な選択になります。
7
flykobe

いつものように、あなたはそれをベンチマークしましたか? file_put_contentsは基本的に3 f*()呼び出しの単なるラッパーなので、せいぜい1つの追加の関数呼び出しを行うことで負けてしまいますが、解析するフロントエンドコードが少なくなることでいくらか得られます。

7
Marc B