Mateusz matipl Kamiński: blog o programowaniu, IT, finansach i własnym życiu

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

Podobne wpisy:

Podziel się tym:

  • Print
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • LinkedIn
  • Twitter
  • Wykop

SUBSKRYBUJ RSS

  • dla programist oszczedność pamięci powinna być podstawowym przykazem podczas tworzenia aplikacji, bo jesli pamiec sie konczy to program sie zamyka :D
    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 :)

Możesz śledzić odpowiedzi za pomocą kanału RSS 2.0

Mateusz matipl Kaminski on Facebook