这是我为这种情况写的两个函数。它们已经在一个拥有数千名成员的网站上使用了一年多,每个成员都有很多文件。
本质上,这个想法是使用每个成员唯一的数据库 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'] 是服务器的绝对路径。希望,否则它们将是不言自明的。