Да, да, я знаю, что это древняя тема. Но проблема в том, чтобы хранить большое количество изображений и как должна быть организована основная структура папок. Итак, я представляю свой способ справиться с этим в надежде, что это может помочь некоторым людям.
Идея использования хэша md5 - лучший способ справиться с массивным хранилищем изображений. Помня, что разные значения могут иметь один и тот же хэш, я настоятельно рекомендую добавить также идентификатор пользователя или имя пользователя к пути, чтобы сделать его уникальным. Ага, это все, что нужно. Если у кого-то разные пользователи с одним и тем же идентификатором базы данных - что ж, что-то не так;) Итак, root_path/md5_hash/user_id
- это все, что вам нужно, чтобы сделать это правильно.
Кстати, использование DATE / DATETIME / TIMESTAMP не является оптимальным решением. В результате вы получаете большие группы папок с изображениями в деловой день и почти пустые в менее посещаемые. Не уверен, что это приводит к проблемам с производительностью, но есть что-то вроде эстетики данных, и согласованное распределение данных всегда лучше.
Поэтому я явно использую хеш-решение.
Я написал следующую функцию, чтобы упростить создание таких путей хранения на основе хешей. Не стесняйтесь использовать его, если он вам нравится.
/**
* 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>";
Полученный результат - раскрашен для вашего удобства;):
person
Hexodus
schedule
15.04.2017
images/o/omg_unicorns
илиimages/p/powerlord
) - person Powerlord   schedule 16.04.2010