5

ユーザーが写真をアップロードできる PHP アプリケーションを構築しています。管理しやすくするために、フォルダには最大 5000 枚の写真を含める必要があります。アップロードされた各写真にはデータベース内の ID が割り当てられ、写真の名前は ID に変更されます。

特定のフォルダに 5000 枚の写真があるかどうかを確認するにはどうすればよいですか? 写真テーブルの最後の行の ID を確認する必要がありますか?

フォルダは増分的に名前が付けられます。例えば。folder_1folder_2など

私の提案する手順:

  1. 写真テーブルの最後の挿入 ID を取得する
  2. (Last_insert_ID + 1) % 5000 = Some_number (保存先のフォルダー番号)
  3. 写真を folder_some_number に保存します。フォルダーが存在しない場合は、新しいフォルダーを作成します。

または、これを行うより良い方法はありますか?

4

6 に答える 6

5

データベースの読み取りは、このようなファイルシステムの読み取りよりも高速になると思います。

SQLクエリを実行し、グループ化されたフォルダごとのカウントを取得することをお勧めします。

// Example Query
SELECT COUNT(file), folderId As Count FROM photos WHERE folderId IN ('1', '2') GROUP BY folder
// It would be beneficial to have a flag on the folders that would enable or disable them
// that way you're not iterating through folders that we already know are > 5k
// You would run this and have seperate query that would pull in these folder names
// and passing them to the above query.
SELECT foldername, folderId FROM folders WHERE countFlag = 0;


//Example Conditional.
if($Count > 5000):
  // Over 5k Do Something
  //Since were over 5k, set this folders flag to 1
  // that way we arent iterating through it again
  $countFlag = 1;
else:
  // Under 5k Do Something else
endif;

注:実際のコードサンプルが必要な場合は、すぐに何かを作成できます。上記の例では、実際に機能するコードは省略されており、理論上の目的にすぎません。返された行はフォルダーごとにグループ化されているため、これらの行を繰り返す必要があります。

于 2012-04-16T14:47:52.683 に答える
2
$last_id; // for example 9591
$current_folder = floor($last_id/5000);
$picture_num_in_folder = $last_id-($current_folder*5000);
if ($picture_num_in_folder == 5000)
    // new dir and such (new folderid = $current_folder+1 and $picture_num_in_folder = 1)
else
    // just place the picture with unique ID $last_id+1 called image_$picture_num_in_folder+1 in folder $current_folder
于 2012-04-16T15:07:40.957 に答える
1

IDが「スキップ」される原因となる可能性のあるエラー条件がいくつかあるため、挿入IDの使用はあまり正確ではない可能性があります。フォルダ番号は、「folder_number」などと呼ばれる別の列に保存できます。そうすれば、最大のフォルダー番号を取得して、そのフォルダー内のレコード数をカウントできます。5000未満の場合は、同じフォルダーに追加します。それ以外の場合は、ロジックを実行してフォルダー数を増やします(物理を作成します)。同時にフォルダ)。

これは、ファイルシステムを使用してチェックするよりも高速である必要があります。これは、話しているファイルの量に対して非常に遅くなる可能性があります。

于 2012-04-16T14:54:05.460 に答える
1

別のアプローチを提案しましょう。たとえば、画像のIDにハッシュを使用し、最初の数文字をパスとして使用します。たとえば、画像IDが1で、ハッシュがであると仮定しますc4ca4238a0b923820dcc509a6f75849b。ディレクトリ構造/rootpath/images/c/4/c/を作成し、その中に画像を保存します。mkdir()のようなネストされたディレクトリを作成するために使用できますmkdir( '/dir/c/4/c/', 0777, true );

このようにして、負荷を多くのフォルダーに自動的に分散し、ID自体がパスになります。

私の記憶が役立つ場合、WordPressは同様のものを使用します...

于 2012-04-16T14:55:49.820 に答える
1

計算に自動インクリメント ID を使用しないでください。ファイルを削除すると、ID シーケンスに穴ができて計算が狂います。ファイルパスを db テーブルに保存します。次に、単純な COUNT を実行します。

SELECT filepath, COUNT(filename) AS num FROM mytable
GROUP BY filepath;

num < 5000 のファイルパスに新しいファイルを保存できます。

于 2012-04-16T14:53:12.600 に答える
-1

この方法でフォルダーとファイルを整理する場合は、フォルダーに 5000 個のファイルがあるかどうかを確認する必要はなく、ファイルを対応するフォルダーに割り当てるだけです。

ax フォルダー内のファイル数が 5000 未満の場合 (最後の ID が 5000*x より大きいため)、一部の画像が削除されたことを意味します。その ID をデータベースの行に再署名することはできないため、削除されたファイルのスペースを補充することはできません。

于 2012-04-16T14:52:43.463 に答える