これがまさにこの状況のために私がしばらく前に書いた2つの関数です。それらは、それぞれがたくさんのファイルを持っている何千ものメンバーがいるサイトで1年以上使用されています。
本質的には、各メンバーの一意のデータベースIDの最後の桁を使用して、すべてのユーザーに一意のディレクトリを持つディレクトリ構造を計算するという考え方です。最初の数字ではなく最後の数字を使用すると、ディレクトリがより均等に分散されます。メンバーごとに個別のディレクトリがあるということは、メンテナンスタスクがはるかに簡単であることを意味します。さらに、(視覚的に)人々のものがどこにあるかを確認できます。
// checks for member-directories & creates them if required
function member_dirs($user_id) {
$user_id = sanitize_var($user_id);
$last_pos = strlen($user_id);
$dir_1_pos = $last_pos - 1;
$dir_2_pos = $last_pos - 2;
$dir_3_pos = $last_pos - 3;
$dir_1 = substr($user_id, $dir_1_pos, $last_pos);
$dir_2 = substr($user_id, $dir_2_pos, $last_pos);
$dir_3 = substr($user_id, $dir_3_pos, $last_pos);
$user_dir[0] = $GLOBALS['site_path'] . "files/members/" . $dir_1 . "/";
$user_dir[1] = $user_dir[0] . $dir_2 . "/";
$user_dir[2] = $user_dir[1] . $dir_3 . "/";
$user_dir[3] = $user_dir[2] . $user_id . "/";
$user_dir[4] = $user_dir[3] . "sml/";
$user_dir[5] = $user_dir[3] . "lrg/";
foreach ($user_dir as $this_dir) {
if (!is_dir($this_dir)) { // directory doesn't exist
if (!mkdir($this_dir, 0777)) { // attempt to make it with read, write, execute permissions
return false; // bug out if it can't be created
}
}
}
// if we've got to here all directories exist or have been created so all good
return true;
}
// accompanying function to above
function make_path_from_id($user_id) {
$user_id = sanitize_var($user_id);
$last_pos = strlen($user_id);
$dir_1_pos = $last_pos - 1;
$dir_2_pos = $last_pos - 2;
$dir_3_pos = $last_pos - 3;
$dir_1 = substr($user_id, $dir_1_pos, $last_pos);
$dir_2 = substr($user_id, $dir_2_pos, $last_pos);
$dir_3 = substr($user_id, $dir_3_pos, $last_pos);
$user_path = "files/members/" . $dir_1 . "/" . $dir_2 . "/" . $dir_3 . "/" . $user_id . "/";
return $user_path;
}
sanitize_var()は、入力をスクラブして数値を確認するためのサポート関数です。$GLOBALS['site_path']はサーバーの絶対パスです。うまくいけば、そうでなければ彼らは自明になるでしょう。