Марто at home



« | »

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/

Posted by on 24 June 2010.

Tags:

Categories: Програмиране

5 Responses

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

    by go_fire on Jun 29, 2010 at 19:47

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

    by Марто on Jun 29, 2010 at 20:02

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

    by Милен on Aug 16, 2010 at 15:56

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

    by Марто on Aug 27, 2010 at 18:28

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

    by Марто on Nov 9, 2011 at 14:45

Leave a Reply

CommentLuv badge

« | »




Recent Posts


Pages