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ć.









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