APC, czyli akcelerator PHP w praktyce

php-logoJęzyk PHP ma to do siebie, że jest bardzo elastycznym językiem i do tego skryptowym. Skryptowym, ponieważ zawsze operujemy na pliku źródłowym, który jest kompilowany w locie przez kompilator PHP, który najczęściej jest połączony z serwerem WWW.

Takie podejście ma bardzo wiele zalet. Nie musimy kompilować całego projektu na nowo, zmieniając jeden warunek (if), ani głowić się nad kompilacją po przeniesieniu kodu np. z Windows do Linuksa. Wiąże się to też z minusami, ale nie o tym chciałem 😉

Niestety to bardzo elastyczne i przydatne podejście PHP niesie ze sobą wymóg wykonywania kompilacji przy każdym odwoływaniu się do naszego pliku, każdego pliku. Co przy sporym projekcie, dobrze zaprojektowanym (setki plików PHP) niesie za sobą problem wydajności maszyny.

Najprostszą optymalizacją w tym wypadku, nie dotykając kodu PHP jest skorzystanie z jednego z rozszerzeń dla PHP dumnie nazywanych akceleratorami. Akcelerator PHP nie robi nic innego niż kompiluje nasz kod źródłowy do kodu operacji (opcode). Dostępne tego typu narzędzia to m.in.:

  • APC
  • PHP Accelerator
  • eAccelerator
  • Zend Platform

APC nie dość, że jest o otwartych źródłach na licencji PHP License to na dodatek jest bardzo wydajnym kompilatorem z zapisywaniem opcode w pamięci. Dodatkowo ogranicza to operacje I/O na dysku co może w inny sposób odciążyć maszynę. Dla osób nie mającego kontaktu z kodem operacji przykład:

Źródło PHP Opcode
<?php
$output = 'Hello World!’;
echo $output;
?>
ASSIGN  !0 'Hello+World%21′
ECHO      !0
RETURN 1
ZEND_HANDLE_EXCEPTION

Samo włączenie APC potrafi przyspieszyć aplikację o 40-300%. W środowisku linuksowym wystarczy skorzystać z PECL:

a następnie w php.ini dołączyć APC oraz skonfigurować:

I to w zupełności wystarczy. Oczywiście, można skorzystać z dodatkowej konfiguracji APC, ale to już zależy od konkretnych potrzeb. Ja np. na maszynach produkcyjnych mam dodatkowo ustawione apc.stat = false , dzięki temu jeszcze bardziej odczujemy przyspieszenie, ale gdy nasze pliki PHP ulegną zmianie APC nie zaktualizuje cache’u.
Jeśli używacie WordPress, nigdy nie ustawiajcie apc.include_once_override na On ;).

Dodatkowo APC udostępnia interfejs dla PHP, dzięki któremu możemy cachować również dane w taki oto sposób:

W przypadku, gdy z APC korzystamy jako głównego mechanizmu cachującego warto ustawić w php.ini wartość dla apc.user_entries_hint na wyższą.