是的,是的,我知道这是一个古老的话题。但是存储大量图像的问题以及底层文件夹结构应如何组织。所以我以我的方式来处理它,希望这可以帮助一些人。
使用md5散列的想法是处理海量图像存储的最佳方式。请记住,不同的值可能具有相同的散列,我强烈建议将用户标识或nicname添加到路径中以使其具有唯一性。是的,这就是所需要的。如果某人有不同的用户使用相同的数据库ID - 那么出现问题了;)因此root_path/md5_hash/user_id
就是您需要做的所有事情。
使用DATE/DATETIME/TIMESTAMP不是IMO方式的最佳解决方案。你最终会在布西日获得大量的图片文件夹,而在不太经常光顾的图片文件夹中几乎是空的。不确定这会导致性能问题,但有一些像数据美学和一致的数据分布总是优越的。
所以我清楚地去寻找解决方案。
我写了下面的函数,以便于生成这种基于散列的存储路径。随意使用它,如果你喜欢它。
/**
* Generates directory path using $user_id md5 hash for massive image storing
* @author Hexodus
* @param string $user_id numeric user id
* @param string $user_root_raw root directory string
* @return null|string
*/
function getUserImagePath($user_id = null, $user_root_raw = "images/users", $padding_length = 16,
$split_length = 3, $hash_length = 12, $hide_leftover = true)
{
// our db user_id should be nummeric
if (!is_numeric($user_id))
return null;
// clean trailing slashes
$user_root_rtrim = rtrim($user_root_raw, '/\\');
$user_root_ltrim = ltrim($user_root_rtrim, '/\\');
$user_root = $user_root_ltrim;
$user_id_padded = str_pad($user_id, $padding_length, "0", STR_PAD_LEFT); //pad it with zeros
$user_hash = md5($user_id); // build md5 hash
$user_hash_partial = $hash_length >=1 && $hash_length < 32
? substr($user_hash, 0, $hash_length) : $user_hash;
$user_hash_leftover = $user_hash_partial <= 32 ? substr($user_hash, $hash_length, 32) : null;
$user_hash_splitted = str_split($user_hash_partial, $split_length); //split in chunks
$user_hash_imploded = implode($user_hash_splitted,"/"); //glue aray chunks with slashes
if ($hide_leftover || !$user_hash_leftover)
$user_image_path = "{$user_root}/{$user_hash_imploded}/{$user_id_padded}"; //build final path
else
$user_image_path = "{$user_root}/{$user_hash_imploded}/{$user_hash_leftover}/{$user_id_padded}"; //build final path plus leftover
return $user_image_path;
}
功能测试呼叫:
$user_id = "1394";
$user_root = "images/users";
$user_hash = md5($user_id);
$path_sample_basic = getUserImagePath($user_id);
$path_sample_advanced = getUserImagePath($user_id, "images/users", 8, 4, 12, false);
echo "<pre>hash: {$user_hash}</pre>";
echo "<pre>basic:<br>{$path_sample_basic}</pre>";
echo "<pre>customized:<br>{$path_sample_advanced}</pre>";
echo "<br><br>";
输出结果 - 着色为了您的方便):
您是否考虑为每个用户制作一个文件夹,可能使用/ letter /用户名格式(例如'images/o/omg_unicorns'或'images/p/powerlord') – Powerlord 2010-04-15 20:19:00
工作正常,但用户名可以更改。我将编辑并添加此信息。 – Mathew 2010-04-15 20:25:33