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/ |
Categories: Програмиране
Малко страничен въпрос. Кой е оцветителя на код, който ползваш? Много ми харесва, а тия до сега които съм виждал в Word-a или нямат номерация на редовете или самата номерация е част от текста, което го съсипва напълно при опит за копиране (запомняне). Благодаря!
by go_fire on Jun 29, 2010 at 19:47
Плугина се казва WP-Syntax – трябваше да опитам доста подобни докато се спра на този 🙂
by Марто on Jun 29, 2010 at 20:02
Здравейте,
Бих си позволил малък съвет за да стане предложението на Марто малко по-елегантно.
Когато преправям библиотеки на Codeigniter, както в случая тук Output.php, преправената библиотека я записвам със същото име , но в application/libraries/. Понеже codeigniter първо търси в тази папка,и ако не намери библиотеката там чак тогава я търси в system/libraries/.
По-горното обаче не се отнася за файловете в system/codeigniter/ както е в случая файла Codeigniter.php. Аз просто пиша коментар в преправеният Output.php , че съм преправял и Codeigniter.php в ред еди кой си и прочие.
По този начин във всеки един момент знам кои от основните файлове съм пипал.
by Милен on Aug 16, 2010 at 15:56
Милене, напълно подкрепям забележката ти за копирането на библиотеките – важно е да се копират, за да е възможен лесен ъпгрейд след това. За коментарите изглежда полезен съвет, но ме притеснява какво ще стане ако се натрупат повече връзки. Ще се получи нещо като книга игра 🙂
by Марто on Aug 27, 2010 at 18:28
В новите версии на Codeigniter има възможност за разширяване на Core класовете и това е по-добрия начин от пачването на Output.php!
Това става, чрез добавяне на файл MY_Output.php в application/core папката. В този файл се екстендват двете функци _write_cache и _display_cache и се добавя горния пач. Този вариант е много по-правилен от първоначалния вариант, който съм описал в поста по-горе.
by Марто on Nov 9, 2011 at 14:45