W 2010 roku polecałem Wam korzystanie z APC, który miał w tamtym czasie bardzo dobre wsparcie, a na rynku zaczął wtedy dominować PHP 5.3. APC z którego przede wszystkim wykorzystywano mechanizm cache opcode sprawiał się wyśmienicie, a w kodzie aplikacji nie trzeba było nic dostosowywać.
Niestety, dla nas wszystkich, w marcu 2012 roku ukazał się udoskonalony PHP (5.4), a do dzisiaj nie ukazała się stabilna wersja obsługująca tę wersję języka. Oczywiście APC działa pod PHP 5.4, ale w pewnych sytuacjach nie bardzo dogaduje się z PHP sypiąc segfault, lub po prostu kończąc wątek.
Całe szczęście na rynku pojawił się PHP 5.5, który oferuje nam możliwość skorzystania z wbudowanego akceleratora PHP – opcache szybszego o około 10-15% od APC. W początkowej wersji (5.5.0) posiadał jeszcze sporo niedociągnięć, ale obecnie można opcache (7.0.2) polecić. Jeśli mamy już PHP 5.5 wystarczy w php.ini wprowadzić następującą modyfikacje:
1 2 3 |
opcache.enable=On zend_extension=opcache.so |
Opcache posiada zbliżone możliwości konfiguracji jak APC. Zalecane przełączniki dla opcache przez twórców:
1 2 3 4 5 6 |
opcache.memory_consumption=128 opcache.interned_strings_buffer=8 opcache.max_accelerated_files=4000 opcache.revalidate_freq=60 opcache.fast_shutdown=1 opcache.enable_cli=1 |
Niestety, tak jak pisałem na Twitterze, opcache nie spełnia specyficznych wymagań. Jeśli na serwerze posiadacie serwisy chrootowane, które mają zbliżoną strukturę ścieżek to opcache zgłupieje. Nie bierze pod uwagę użytkownika jako który jest uruchamiany, ani ścieżki nadrzędnej, tylko te w chroot które są identyczne.
W tym momencie jedynym pomysłem jest użycie unikalnych nazw katalogów zamiast docroot/.
Użytkownicy PHP 5.2, 5.3 i 5.4 nie muszą jednak ronić łez, opcache dostępny jest dla nich w PECL.
Jeśli potrzebujecie podejrzeć jak sprawuje się opcache, podobnie jak dla APC istnieje jedno plikowy opcache-status. Wystarczy umieścić go na serwerze i wywołać przez http.