CodeIgniter output cache directory tweak

Кешовете имат относителна полза, понякога са напълно излишни, друг път наложителни.

Какво всъщност е кеш? Ако приемем, че дадено приложения/софтуер/програма изпълнява математическа задача, то кеш е запазването на нейния резултат и използването му в бъдеще. Няма причина да се използват ресурси, за да бъде изчислявана една и съща задача всеки път когато е нужен резултата от тази задача. За това и резултата се запазва и това запазване се нарича кеширане. Важно е да се внимава, защото задачата може да има различни входящи данни, в този сличай използването на кеширания резултат е неуместно, но пък за това е масова практика, за сължание.

От известно време използвам готовия framework CodeIgniter – много добра работа върши, но има някой недомислици и неудобства. Едно от тях е възможността кеша на дадена страница да бъде премахван лесно и по всяко време, при това само за конкретния контролер. Причината за това е, че CodeIgniter пази всички кеш файлове на едно място с имена md5 суми на URI адреса. Получава се неприятното положение в една директория да има десетки хиляди файлове – тъпо но факт.

Ето и моето решение на проблема. Не е особено елегантно, тъй като се налага пипането в основните файлове на CodeIgniter, което никак не е препоръчително. Все пак важно е да работи 😉

Във файла system/libraries/Output.php ред 314 замествам с:

1
2
3
4
5
6
7
8
9
10
11
12
13
/** Directory Cache Fix  (mlazarov) **/
$uri_md5=md5($uri);
$fl = mb_substr($uri_md5,0,1);
$controller = $CI->router->class;
$function = $CI->router->method;
 
$cache_path.=$controller.'/'.$function.'/'.$fl.'/';
if(!is_dir($cache_path)){
mkdir($cache_path,0777,true);
}
 
$cache_path.= $uri_md5;
/** END FIX ***/

След което ред 360 в същия файл го заменям с :

1
function _display_cache(&$CFG, &$URI,&$RTR)

Заменям ред 374 с това:

1
2
3
4
5
6
7
8
9
10
11
12
/** Directory Cache Fix  (mlazarov) ***/
$uri_md5=md5($uri);
$fl = mb_substr($uri_md5,0,1);
$controller = $RTR->class;
$function = $RTR->method;
 
$cache_path.=$controller.'/'.$function.'/'.$fl.'/';
if(!is_dir($cache_path)){
return FALSE;
}
/** END FIX ***/
$filepath = $cache_path.$uri_md5;

Последната стъпка е във файла system/codeigniter/Codeigniter.php заменям ред 110 с:

1
if ($OUT->_display_cache($CFG, $URI,$RTR) == TRUE)

След като всичко се направи правилно Codeigniter ще започне да създава кеш файловете по директории в следния формат:
cache/home/index/[first letter of the md5 sum]/[md5 sum].html

Така премахването на кеша за контролера home ще стане като се затрие директорията home в папката cache:

1
rm -rf home/

5 Responses to “CodeIgniter output cache directory tweak”

  1. go_fire says:

    Малко страничен въпрос. Кой е оцветителя на код, който ползваш? Много ми харесва, а тия до сега които съм виждал в Word-a или нямат номерация на редовете или самата номерация е част от текста, което го съсипва напълно при опит за копиране (запомняне). Благодаря!

  2. Марто says:

    Плугина се казва WP-Syntax – трябваше да опитам доста подобни докато се спра на този 🙂

  3. Милен says:

    Здравейте,
    Бих си позволил малък съвет за да стане предложението на Марто малко по-елегантно.
    Когато преправям библиотеки на Codeigniter, както в случая тук Output.php, преправената библиотека я записвам със същото име , но в application/libraries/. Понеже codeigniter първо търси в тази папка,и ако не намери библиотеката там чак тогава я търси в system/libraries/.
    По-горното обаче не се отнася за файловете в system/codeigniter/ както е в случая файла Codeigniter.php. Аз просто пиша коментар в преправеният Output.php , че съм преправял и Codeigniter.php в ред еди кой си и прочие.
    По този начин във всеки един момент знам кои от основните файлове съм пипал.

  4. Марто says:

    Милене, напълно подкрепям забележката ти за копирането на библиотеките – важно е да се копират, за да е възможен лесен ъпгрейд след това. За коментарите изглежда полезен съвет, но ме притеснява какво ще стане ако се натрупат повече връзки. Ще се получи нещо като книга игра 🙂

  5. Марто says:

    В новите версии на Codeigniter има възможност за разширяване на Core класовете и това е по-добрия начин от пачването на Output.php!
    Това става, чрез добавяне на файл MY_Output.php в application/core папката. В този файл се екстендват двете функци _write_cache и _display_cache и се добавя горния пач. Този вариант е много по-правилен от първоначалния вариант, който съм описал в поста по-горе.

Leave a Reply

CommentLuv badge