2011-06-20 10 views
30

何が良いですか?私は自分のMySQLログを持っているので、約90MBですが、どちらを使うべきかはわかりません。 EVERYTIMEファイルを開き、実行するクエリがあります。もっと速いですか? file_put_contents(); fopen(); fwrite(); fclose();

もっと速いですか?

+4

独自のベンチマークを実行します。私はそれが90 MBのファイルを開く時間がかかることはないと確信しています。 – BoltClock

+0

はありません。それは問題です、私は共有ホスト上にあり、実稼働中ですので、単に "テスト"できません。 – genesis

+0

ローカル開発マシンでテストすることができます。 – KingCrunch

答えて

35

this articleによれば、fwrite()はより速くsmidgenです。 (ウェイバックマシンへのリンク、サイトが既に存在しないため。)

私の推測では、file_put_contents()とにかくこれらの3つの方法の周りだけのラッパーですので、あなたはオーバーヘッドを失うだろうということです。

編集This siteは同じ情報を持っています。

+0

-1これは、もはや存在しないサイトを参照するだけの答えでもあります - あなたはそれからサイトまたは参照記事を引用することができました - downvote – TheBlackBenzKid

+0

Er、サイトは1年前に存在しました。私はおそらくそれをもっと最近のものに変えるべきです。 – hwrdprkns

+1

元の記事は、Wayback Machineでも見ることができます:http://web.archive.org/web/20100109103851/http://balancedbraces.com/2008/06/12/fopen-fwrite-fclose-vs-file_put_contents/ –

5

通常通り、ベンチマークしましたか? file_put_contentsは本質的には3 f*()の呼び出しのラッパーです。したがって、たいていあなたは1つの余分な関数呼び出しを行うことで負けていますが、解析するフロントエンドコードが少なくて済みます。

22

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

は、ドキュメントをチェック: http://php.net/manual/en/function.file-put-contents.php

ショーン

+0

http://www.php.net/downloads.phpまた、ソースを入手してボンネットの下に砂時計を得ることができます。これらのタイプの質問に答えるのに役立ちます。 – shaunhusain

+1

ソースをもう少し調べたところ、fwriteはstreams.cからphp_stream_writeを直接使用しているようですが、zend機能を使用していない限り、file_put_contentsへの呼び出しも最終的に(Zendフラグ)php_stream_writeを呼び出すと、他の人がこれをテストしているように(プロダクションではなくテストボックスでも)、質問に答える最良の方法であり、特定のシナリオによって異なります。 – shaunhusain

8

はあなたのユースケースに依存します。私は.5 GB以上のファイルをオープンしましたが、私は確かにfile()やfile_get_contents()を使用したくありませんでした。ファイルを読む必要があったため、file_put_contentsが機能しませんでした。

読んでいないファイルを追加することに本当に関心がある人は、大したことではありません。ファイル全体をメモリに読み込もうとしている場合(またはメモリからファイル全体を書き込む場合)、同様に重要ではありません。スピードゲインは、私が目にしたところでは丸め誤差です。

しかし、これらのファイルが膨大な巨大なものになることが予想される場合、または特定のファイルの行数の一部だけが必要な場合は、fopen(またはSplFileObject、これは素晴らしいです)強く十分です。これらのファイルの真ん中から読むのは本当に簡単です。


あなただけログインしているので、他の一方で、私は、個人的には、単純にアペンドフラグを付けてますfile_put_contentsを使用することがより明確かつ簡潔見つけます。それは、二度見なくても何が起こっているのかを誰にでも知らせることができます。

+0

大丈夫、ありがとう。私はスクリプトを書いているだけです。 – genesis

+0

@genesis申し訳ありませんが、今日は私の仕事用マシンで問題が発生しています(大規模なSVNチェックアウトに関係することがありますが、それは何でも可能です)、あなたはそれを見た前にその補遺を得ることができませんでした。 – cwallenpoole

6
  1. リクエストで1つのファイルに対して書き込み操作が1つしかない場合、file_put_contentsはオープン、書き込み、およびクローズ機能を持ち、fwriteと同じくらい速いため、fwriteよりも優れています。
  2. リクエストに1つのファイルに対して複数の書き込みがある場合は、まずファイルを開く必要があります。次に複数回書き込むので、fwriteは高速です。しかし、 "オープンファイル"(ulimit -a | grep "オープンファイル")がたくさんある非常にビジーなシステムでは、ファイルハンドラをfwriteよりも短く保つので、file_put_contentsはより合理的な選択となります。
関連する問題