8

私は最近、かなり巨大なサイトの開発を始めました。このサイトでは、ユーザーがサンプル作品をアップロードできるようにしたいと考えています。現時点ではかなり制限されているため、画像はサーバーに保存されます。

私はロジックに少しこだわっています。したがって、私のロジックは次のようになります。

users idユーザーは、名前が付けられたフォルダーを作成し、データベースに保存されます。

フォルダ テーブル

id | folder        | user_id 
1  | Some folder   | 1
2  | New folder    | 4
3  | Nother folder | 7

画像表

id | image_name        | folder_id |
1  | image1.jpg        | 1
2  | image2.jpg        | 1
3  | image3.jpg        | 1
4  | image4.jpg        | 2
5  | image5.jpg        | 2
6  | image6.jpg        | 2

関係

class Folder extends Eloquent 
{
    public function images()
    {
        return static::has_many('Images');
    }
}

class Image extends Eloquent 
{
    public function folder()
    {
        return static::belongs_to('Folder');
    }
}

サーバー上のフォルダー構造

- samples
  -user_id
   - folder_id
     - image1
     - image2
     - image3

ご覧のとおり、ユーザーはフォルダーを作成し、フォルダーが作成された後user、画像名をデータベースにfolders idアップロードします.

だから私の質問。

  • これはあなたの意見では良い論理ですか
  • これは将来問題を引き起こす可能性があります
  • この機能のために何を提供しますか

そして、私が最も神聖視しているのは 2 つのことです。

これは巨大なデータベースにつながると思います。2 番目は です。id'sx 時間後にユーザーid'sが増えると、 が増加します。これは奇妙に聞こえるかもしれませんが、多くのユーザーが画像をアップロードすると巨大な ID につながるため、これはおそらく数百万に達すると思いますが、この問題を解決する方法はありますか?

お手伝いありがとう

4

2 に答える 2

19

わかりました-これをいくつかのサブ回答に分解しましょう。

質問:

- Is this a good logic in your opinion
- Can this lead problems in the future
- What would you offer for this functionality

答え:

論理は聞こえるかもしれませんが、画像をどこに保存するのか興味がありますか?public_htmlの内部-またはWebルートの外部?public_html内に画像があり、ブラウザがそれらに直接アクセスできるようにすると、ユーザーは他のユーザーフォルダを「推測」してそれらにアクセスできるようになります。データを安全に保存する必要があります。

Webルートの外部で画像を作成し、許可されたユーザーのみが画像にアクセスできるようにするには、readfile()を使用する必要があります。このような何かがトリックを行います

function user_file($file_name = "")
{
    if ($file_name)
    {
         // Ensure no funny business names to prevent directory transversal etc.
         $file_name = str_replace ('..', '', $file_name);
         $file_name = str_replace ('/', '', $file_name);

         // now do the logic to check user is logged in
         if (Auth::check())
         {
                // Serve file via readfile() - we hard code the user_ID - so they
                // can only get to their own images
               readfile('../your_app/samples/'.Auth::user()->id.'/'.$file);
         }
    }
}

質問:

これは巨大なデータベースにつながると思います。2番目はIDです。x時間後にユーザーが増えるとIDが増え、奇妙に聞こえるかもしれませんが、多くのユーザーが画像をアップロードするため、巨大なデータベースになります。 idの、これが意味することはおそらく数百万に達するでしょう

答え:

mySQLの機能ページによると:

5,000万件のレコードを含むデータベースでMySQLサーバーを使用しています。また、200,000のテーブルと約5,000,000,000の行でMySQLサーバーを使用しているユーザーも知っています。

つまり、50億行です。あなたはおそらく数百万に達するでしょう。したがって、ここでは安全です(ハードウェアによって異なります)。

質問:

...しかし、多くのユーザーが画像をアップロードすると巨大なIDが発生するため、これはおそらく数百万に達する可能性があります。この問題を解決する方法はありますか?

答え:

何百万ものレコードを保存したくなく、パフォーマンスが心配な場合、1つのオプションは、フォルダーテーブルを保持し、イメージテーブルを削除することです。代わりに、フォルダでscandir()を使用して、PHPにディレクトリ自体からファイル名を取得させることができます。そうすれば、それほど多くのオーバーヘッドはありません。

<?php
    $list_of_user_files = scandir("$user_id/$folder_id");
    foreach ($list_of_user_files as $file) {
          echo "File: $file <br>";
    }
?>
于 2013-02-07T13:20:53.767 に答える
1

フォルダテーブルの格納と scandir 関数の使用方法は、標準的な手順です。そして、php がフォルダーからファイル名を取得できるようにします。ファイル数が多い場合はワードプレスのように年月順に分類してみてください。お気に入り

2012
  01
  02
  03
2013
  01
  02
  03 

フォルダID内など。そのため、フォルダー内の画像の総数は比較的少なくなります。

于 2013-02-11T15:56:08.827 に答える