Technologia

Jak przyśpieszyć PHP

Nie oszukujmy się… PHP jest wolne…

Powiedziałbym nawet, że w domyślnej konfiguracji jest bardzo wolne. W sumie nie jest to nic odkrywczego, prawda? W sumie nie wynika to z tego, że PHP jest kiepskim językiem programowania, po prostu jest to cecha języków interpretowanych. Każde wywołanie skryptu, powoduje jego załadowanie do pamięci, analizę, TYMCZASOWE skompilowanie do postaci bytecode’u, które musi być powtórzone przy każdym wywołaniu skryptu, wykonanie i zwolnienie pamięci, co w przeciwieństwie do języków kompilowanych, w których kod źródłowy tłumaczony jest jednorazowo na język maszynowy, który jest zapisywany i potem wykonywany, co znacząco przyśpiesza jego działanie.

Inna rzecz, że pisanie aplikacji web w C/C++/C#, czy innych językach kompilowanych nie jest zbyt wygodnym rozwiązaniem (chociaż w niektórych sytuacjach mogłoby być optymalne). PHP jest powolne, ale jest też wyjątkowo proste, z bogatym wyborem bibliotek i gotowych rozwiązań, a co za tym idzie łatwe w implementacji. Jest też BARDZO przenośne, co oznacza, że ten sam kod z reguły bez większych trudności da się uruchomić na innym serwerze (chociaż są tu wyjątki), a jeśli się nie uruchamia, to przeciętny programista szybko go naprawi. Rozwiązaniem problemu, jest uruchomienie na serwerze tzw. opcode cache, który optymalizuje skompilowanybytecode, po czym zapisuje go do pamięci i dodatkowo na dysk. Każde następne wykonanie skryptu, powoduje odwołanie się do zapisanego, skompilowanego już kodu, co pozwala przyśpieszyć działanie do 10 razy.

Instalacja
Proces instalacji przedstawię na przykładzie Debiana, natomiast przeciętny administrator będzie w stanie powtórzyć go na swojej ulubionej dystrybucji :-)

Przed instalacją eacceleratora, potrzebujemy zainstalować odpowiednie paczki:
apt-get install build-essential php5-dev

Potem ściągamy najnowszą (na dzień 11.04.2011) wersję eacceleratora, rozpakowujemy ją i wchodzimy do katalogu z kodem źródłowym:
wget http://bart.eaccelerator.net/source/0.9.6.1/eaccelerator-0.9.6.1.tar.bz2
tar xvfj eaccelerator-0.9.6.1.tar.bz2
cd eaccelerator-0.9.6.1

Następnie wykonujemy: phpize
./configure
make
make install

W tej chwili mamy już zainstalowanego go na dysku, a jedyne co nam pozostaje, to skonfigurować PHP, by z niego korzystało. Domyślnie w Debianie konfiguracja przechowywana jest w katalogu /etc/php5/conf.d i tam też tworzymy plik eaccelerator.ini, do którego,naszym ulubionym edytorem (ja wiem, że miłośnicy wielkiej wojny między vimem a emacsem mnie zjedzą, ale ja używam w tym celu nano) wklejamy co następuje:
extension="eaccelerator.so"
eaccelerator.shm_size="32"
eaccelerator.cache_dir="/var/cache/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"

Najważniejsze dla nas są:
eaccelerator.shm_size=”32″ – która ustawia wielkość cache na 32MB (wystarczające dla mało obciążonych maszyn, jednakże można sobie spokojnie podnieść do 128-256MB), można też ustawić wartość „0”, wtedy wielkość ta będzie ustalana automatycznie.
eaccelerator.cache_dir=”/var/cache/eaccelerator – Katalog, w którym przechowywany na dysku jest opcode cache. Można sobie ustawić dowolny katalog, jednakże co najważniejsze, należy mu nadać odpowiednie uprawnienia:
mkdir /var/cache/eaccelerator
chown -R www-data:www-data /var/cache/eaccelerator
chmod 0770 /var/cache/eaccelerator

Tradycyjnie restart serwera WWW:
/etc/init.d/apache2 restart

Lub, jeśli używacie Nginxa z FPM-CGI (idealne rozwiązanie na małe maszyny, być może opiszę następnym razem, jeśli ktoś będzie reflektował):
/etc/init.d/php5-fpm restart

Sprawdzić czy działa możemy tworząc na serwerze plik test.php, wywołujący funkcję:
phpinfo();

Jeśli jest w nim info o eacceleratorze, oznacza to, że nasz opcode cache działa :-)

W razie pytań, chętnie pomogę :-)
Strona domowa eacceleratora: http://eaccelerator.net/