Dawno na blogu nie pisałem nic o optymalizacji – postanowiłem odświeżyć temat.
Obecnie bardzo wiele osób korzystających z PHP używa do tego standardowego zestawu LAMP (Linux + Apache + MySQL + PHP) i dla nich będzie ten wpis.
W używaniu LAMP nie ma w tym nic złego. I nie zamierzam nikomu kazać zmieniać przyzwyczajeń lub uczyć się nowego oprogramowania. Za to pokażę jak łatwo można zmniejszyć zużycie zasobów naszej maszyny (szczególnie pamięci RAM) korzystając z opcode caching, czyli tzw. akceleratorów do PHP.
Jednym z rodziny opcode caching jest APC, gdzie o sposobie jego używania już Wam pisałem. Dzisiaj chciałbym pokazać Wam, że w wypadku gdy korzystamy z frameworka powinniśmy zawsze korzystać z APC. W moim przykładzie oprę się o wyniki dla Zend Frameworka.
Postawiłem LAMP w oparciu o aktualną wersję Debiana. Stworzyłem za pomocą Zend_Tool pustą aplikację w oparciu o ZF.
W bazie stworzyłem jedną pustą tabelę user z polem id i name. W IndexController::indexAction w prosty sposób z niej skorzystałem i dodałem prostą metodę zliczającą zajętość pamięci w taki oto sposób:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public function indexAction() { $start = $this->_memoryUsage(); $userModel = new Model_User(); //klasa dziedzicząca po Zend_Db_Table $this->view->start = $start; $this->view->users = $userModel->fetchAll(); $this->view->end = $this->_memoryUsage(); } protected function _memoryUsage() { $mem_usage = memory_get_usage(true); $usage = ''; if ($mem_usage < 1024) $usage = $mem_usage . ' bytes'; elseif ($mem_usage < 1048576) $usage = round($mem_usage/1024,2) . ' kilobytes'; else $usage = round($mem_usage/1048576,2) . ' megabytes'; return $usage; } |
Przy braku korzystania z APC na mojej maszynie developerskiej uzyskałem wynik:
1 2 |
MEM start: 5.5 megabytes MEM end: 6 megabytes |
Wynika z tego, że skorzystanie z ZF wymaga 5.5 MB, i użycie dodatku w postaci Zend_DB zjada dodatkowo 0.5 MB RAM. Czy to dużo?
Aplikacja, która korzysta ze średniej ilości dodatków ZF w postaci helperów, bazy, formularzy, validatorów zużywa już około 30 MB pamięci
Po tym gdy aktywowałem APC, w taki sposób jak opisywałem we wcześniejszych postach zużycie dla całej naszej aplikacji spada 3-krotnie:
1 2 |
MEM start: 1.75 megabytes MEM end: 2 megabytes |
Dla wspomnianej średniej aplikacji ZF owe zużycie również spada trzykrotnie do około 10 MB. Jest to bardzo duży zysk. W naszym przypadku zauważcie, że posługujemy się „jedną instancją aplikacji”.
Podsumowując – warto – oszczędzamy pamięć, jak również mamy zysk na czasie wykonywania się aplikacji.
Każdy framework ma to do siebie, że jest zbudowany z wielu klocków (duża zaleta), ale wiąże się to również z dużą ilością plików do przeczytania i wykonania (w przypadku PHP) co opcode caching jest w stanie bardzo przyspieszyć.