4

現在、サイト用に画像を保存する方法を微調整しています。すべてのユーザーについて、プロフィール画像があるかどうかを確認しています。ファイルがフォルダー構造に存在するかどうかを確認することでこれを行っています。これは、DB テーブルに画像の名前を保存/取得するよりも高速ですか? ?

現在の file_exists コードは次のようになります。

$gender = ($gender == 1) ? 'female' : 'male';

$filename = SITE_ROOT . $this->img_url . $user_id . 'medium_thumb.jpg';

if (file_exists($filename)) {
    $filename = $this->img_url . $user_id . 'medium_thumb.jpg?v=' . time();
}
else {
    $filename = '/images/'.$gender.'.jpg';
}       

return $filename
4

6 に答える 6

8

file_exists()ファイル名がデータベースに完全に保存されている場合でも、使用することをお勧めします。これにより、エラーが発生して DB がファイルシステムと同期していない場合に、合理的なフォールバックが得られます。このような場合には、複数レベルのエラー処理があると便利です。

file_exists()それを考えると、どちらの場合でも使用するため、質問は不要です。

さらに、コードをマイクロ最適化する誘惑に抵抗することをお勧めします。多くの呼び出しを行っていない限りfile_exists()、プログラムの速度に大きな違いはありません。通常、このレベルでパフォーマンスを微調整する必要はありません。

コードのパフォーマンスが心配な場合は、XDebug などのプロファイリング ツールを使用して、実際のパフォーマンスのボトルネックがどこにあるかを示してください。いくつかはありますが、ループしていない限り、ここで見ているコードには含まれていないことを保証します。

于 2012-07-27T12:37:40.653 に答える
1

file_existsの方がはるかに高速だと思います。SQLを使用している間は、ドライバーなどにアクセスする必要がありますが、file_existsはシステムアクションです。

于 2012-07-27T12:33:08.587 に答える
1

すべての画像を1つのフォルダに保存しないでください。サブフォルダーを使用します-そうしないと、I / Oによってパフォーマンスが大幅に低下します(10k以上のファイルがある場合は目立ちますが、10万以上のファイルがある場合は巨大になります)

apacheはリソースを大量に消費するため、画像がapacheからではなく、nginxなどの軽量Webサーバーによって提供されていることを確認してください。

そして今、質問です。一般的に、ファイルシステムはより高速になります。ただし、ファイルシステムをさまざまなサーバー間で拡張することは困難です。たとえば、2つのWebサーバーがある場合、どちらからアバターにサービスを提供しますか?すべてのサーバー上のすべてのファイルをコピーするか、共有ディスクを使用するか、分散ファイルシステムを使用する必要があります。したがって、パフォーマンスだけでなく、水平方向のスケーラビリティも考慮する必要があります。

また、Varnishなどのファイルにキャッシュを使用することもできます

于 2012-07-27T12:34:11.930 に答える
0

最終的にデータベースもディスクに送られるため、データベースのクエリにはもっと時間がかかると思います。

つまり、ディスクをチェックする場合、操作は1つですが、データベースの場合は、データベースに接続してから、ディスク(dbファイルが保存されている場所)に移動します。したがって、ファイルシステムはより高速であるはずです(私はそれをベンチマークしていません!)。

于 2012-07-27T12:34:32.073 に答える
0

私の見解では、短期的には、あなたのアプローチはより速くなります。ただし、データベースから画像名を取得してセッションに保存すると、サーバー上にファイルが存在するかどうかを確認する代わりに、そのページにアクセスするたびにセッションから値を取得できるため、長期的には高速になります。いいえ。

于 2012-07-27T12:29:47.163 に答える
0

答えは非常に多くの変数に依存するため、簡単なテストを実行して、「どちらが優れているか」という質問に答えることをお勧めします。また、関連する質問「どのくらい良いですか?」:

curl (またはお気に入りの自動化された HTTP クライアント) を使用して、ファイルベースのコードを 1000 回ヒットし、クライアント側で経過した時間とサーバー側で消費されたリソースを測定してから、DB ベースのコードで同じことを行います。

値が小さい場合は、テストを数回実行します (または、テスト サイズを 10000 に増やします)。

于 2012-07-27T12:32:22.583 に答える