Ję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:
1 |
pecl install apc |
a następnie w php.ini dołączyć APC oraz skonfigurować:
1 2 3 4 |
extension=apc.so apc.enable = On apc.shm_size = 128 //ilosc pamieci RAM, z ktorej moze korzystac APC |
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:
1 2 3 4 5 6 7 8 9 10 |
$status = false; //pobieramy z cachowane dane z APC $data = apc_fetch('name', $status); //jesli danych nie ma to wykonujemy normalnie nasz kod if(!$data) { $data = 'Kowalski'; //i zapisujemy do APC apc_add('name', $data, 86400); } echo $data; |
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ą.