Итак представим что у вас или у вашего клиента большой, высоко-посещаемый сайт. Также представим инфоблок в котором больше 80k элементов. Наверняка у этих элементов есть детальное описание и я уверен 99,9% что ID кэша это ID вашего элемента.
Итак у нас получается что в папке допустим /bitrix/cache/object_80k/ — 80 000 папок с кэшем, т.е.
/bitrix/catche/object_80k/1
/bitrix/catche/object_80k/2
/bitrix/catche/object_80k/3
/bitrix/catche/object_80k/n
/bitrix/catche/object_80k/80 000
Какой бы у вас не был сервер, поиск папки в общем списке из 80k занимает время. Плюс если сайт посещаемый то вы догадываетесь что происходит, нагрузка на ровном месте, даже я бы сказал в том месте где мы пытаемся ее уменьшить.
Итак решение, на мой взгляд просто очень красивое и элегантное, его подсказал мой коллега Николай Рыжонин.
function __getGenerationCachePath($id)
{
$hash = md5($id);
$path = substr($hash,-4,2).'/'.substr($hash,-2);
return $path;
}
Пример:
$ob_Cache = new CPHPCache;
$i_CacheTime = 3600;
$s_CacheID = $ID;
$s_CachePatch = "/object_80k/" . __getGenerationCachePath($ID) . "/" . $ID . "/";
if($ob_Cache->InitCache($i_CacheTime, $s_CacheID, $s_CachePatch))
{
$ar_Cache = $ob_Cache->GetVars();
$ar_Result = $ar_Cache['ITEAM'];
}
else
{
$ar = ''; // выборка
if($obCityCache->StartDataCache())
{
$obCityCache->EndDataCache(array('ITEAM' => $ar));
}
}
Итак функция создаст путь вида /object_80k/as/df/ID и тем самым разобьет 80k папок на под папки, тем самым уменьшит время поиска кэша и общую нагрузку на сервер.
Да и еще важный момент, функция написана с учетом что ID > 100 000k. хотя тем кому это пригодится это не важно…