PHP APC – czy warto korzystać z opcode caching?
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:
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:
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:
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ć.








Mateusz Kamiński

jaras
22 sty, 2010
dla programist oszczedność pamięci powinna być podstawowym przykazem podczas tworzenia aplikacji, bo jesli pamiec sie konczy to program sie zamyka
Taka prosta zasada. W tym przypadku mając na uwadze fakt, iz mamy do czynienia z kompilowaniem plikow w locie, bo aplikacja oparta np. na ZF jest dynamiczna i bardzo istotne jest, aby ten etap został przyspieszony.
Test pokazuje jasno, ze powinnismy korzystac z tego mechanizmu