Jak korzystać z PHP OPCache?

249

PHP 5.5 zostało wydane i zawiera nowy moduł buforowania kodu o nazwie OPCache, ale wydaje się, że nie ma dla niego żadnej dokumentacji.

Więc gdzie jest dokumentacja i jak korzystać z OPcache?

Danack
źródło
4
Dokumentacja: php.net/manual/en/book.opcache.php
David Oliver
Szkoda, że ​​Dokumentacja NIE mówi nam, jak poprawnie skompilować opcache / wyłączyć go, ani obejść autoconf źródła PHP 5.6.24+, aby PHP się skompilowało! :-(
Filip OvertoneSinger Rydlo
@ Fred-ii- „Istnieje wiele ustawień, które mogą wymagać dostosowania. Zrozumienie, jak to działa i identyfikacja problemów podczas fazy stabilizacji procesu wydania PHP 5.5, bardzo pomoże”. ... Ten post na blogu nie jest zbyt pomocny. Nie wyjaśnia, jak zrozumieć, jak to działa lub jak najlepiej dostosować ustawienia :(
icc97

Odpowiedzi:

371

Instalacja

OpCache jest kompilowany domyślnie na PHP5.5 +. Jest jednak domyślnie wyłączone. Aby rozpocząć korzystanie z OpCache w PHP 5.5 +, musisz go najpierw włączyć. Aby to zrobić, musisz wykonać następujące czynności.

Dodaj następujący wiersz do php.ini:

zend_extension=/full/path/to/opcache.so (nix)
zend_extension=C:\path\to\php_opcache.dll (win)

Zauważ, że gdy ścieżka zawiera spacje, powinieneś zawinąć ją w cudzysłów:

zend_extension="C:\Program Files\PHP5.5\ext\php_opcache.dll"

Zauważ też, że będziesz musiał użyć zend_extensiondyrektywy zamiast „normalnej” extensiondyrektywy, ponieważ wpływa ona na rzeczywisty silnik Zend (tj. Na rzecz, która uruchamia PHP).

Stosowanie

Obecnie można korzystać z czterech funkcji:

opcache_get_configuration():

Zwraca tablicę zawierającą aktualnie używaną konfigurację, której używa OpCache. Obejmuje to wszystkie ustawienia ini, a także informacje o wersji i pliki z czarnej listy.

var_dump(opcache_get_configuration());

opcache_get_status():

Zwróci tablicę z informacjami o bieżącym stanie pamięci podręcznej. Informacje te będą obejmować między innymi: stan pamięci podręcznej (włączony, restart, pełny itp.), Użycie pamięci, trafienia, chybienia i kilka innych przydatnych informacji. Będzie także zawierać skrypty buforowane.

var_dump(opcache_get_status());

opcache_reset():

Resetuje całą pamięć podręczną. Oznacza to, że wszystkie możliwe skrypty z pamięci podręcznej zostaną ponownie przeanalizowane podczas następnej wizyty.

opcache_reset();

opcache_invalidate():

Unieważnia określony skrypt w pamięci podręcznej. Oznacza to, że skrypt zostanie ponownie przeanalizowany podczas następnej wizyty.

opcache_invalidate('/path/to/script/to/invalidate.php', true);

Konserwacja i raporty

Istnieje kilka GUI, które pomagają w utrzymywaniu OpCache i generowaniu przydatnych raportów. Narzędzia te wykorzystują powyższe funkcje.

OpCacheGUI

Oświadczenie Jestem autorem tego projektu

Cechy:

  • Status OpCache
  • Konfiguracja OpCache
  • Statystyki OpCache
  • Reset OpCache
  • Omówienie skryptów w pamięci podręcznej
  • Unieważnienie skryptów w pamięci podręcznej
  • Wielojęzyczny
  • Obsługa urządzeń mobilnych
  • Błyszczące wykresy

Zrzuty ekranu:

status

skrypty buforowane

wykresy

mobilr

URL: https://github.com/PeeHaa/OpCacheGUI

status opcache

Cechy:

  • Status OpCache
  • Konfiguracja OpCache
  • Statystyki OpCache
  • Omówienie skryptów w pamięci podręcznej
  • Pojedynczy plik

Zrzut ekranu:

status

URL: https://github.com/rlerdorf/opcache-status

opcache-gui

Cechy:

  • Status OpCache
  • Konfiguracja OpCache
  • Statystyki OpCache
  • Reset OpCache
  • Omówienie skryptów w pamięci podręcznej
  • Unieważnienie skryptów w pamięci podręcznej
  • Automatyczne odświeżanie

Zrzut ekranu:

przegląd opcache-gui

URL: https://github.com/amnuts/opcache-gui

PeeHaa
źródło
6
Coś w związku z PHP-CLI? Jak korzysta z niego CLI? Po ponownym uruchomieniu FPM OPCache resetuje się - czy wpływa to również na OPCache CLI? Czy interfejs OPCache CLI jest osobny, czy dzieli tę samą pulę pamięci podręcznej z FPM? Dzięki!
Shahriyar Imanov
3
OpCache był domyślnie włączony w mojej najnowszej instalacji na Ubuntu 14.04, apache 2.4.7, php 5.5.9.
jstats
cześć, na twoim trzecim zrzucie ekranu cache_full jest fałszywe, zakładam, że ma to związek z pełnym buforowaniem strony, czy możesz mi powiedzieć, jak to włączyć? (
spraw,
Mylę się, że nie chodzi o buforowanie całej strony, ale pokaże się jako prawda, jeśli pamięć używana przez pamięć podręczną jest pełna. W każdym razie dzięki!
brucekaushik
zend_extension = C: \ path \ to \ php_opcache.dll (win) - Dodawanie tej linii w php.ini działa poprawnie.
kalidasan
152

OPcache zastępuje APC

Ponieważ OPcache ma zastąpić moduł APC, nie jest możliwe równoległe uruchamianie ich w PHP. Jest to dobre do buforowania opkodu PHP, ponieważ żaden z nich nie wpływa na sposób pisania kodu.

Oznacza to jednak, że jeśli obecnie używasz APC do przechowywania innych danych (poprzez apc_store()funkcję), nie będziesz w stanie tego zrobić, jeśli zdecydujesz się użyć OPCache.

Musisz użyć innej biblioteki, takiej jak APCu lub Yac które przechowują dane we wspólnej pamięci PHP, lub przełącz się na coś takiego jak memcached, który przechowuje dane w pamięci w innym procesie niż PHP.

Ponadto OPcache nie ma odpowiednika miernika postępu wysyłania obecnego w APC. Zamiast tego należy użyć Postępu przesyłania sesji .

Ustawienia OPcache

Dokumentację OPcache można znaleźć tutaj ze wszystkimi wymienionymi tutaj opcjami konfiguracji . Zalecane ustawienia to:

; Sets how much memory to use
opcache.memory_consumption=128

;Sets how much memory should be used by OPcache for storing internal strings 
;(e.g. classnames and the files they are contained in)
opcache.interned_strings_buffer=8

; The maximum number of files OPcache will cache
opcache.max_accelerated_files=4000

;How often (in seconds) to check file timestamps for changes to the shared
;memory storage allocation.
opcache.revalidate_freq=60

;If enabled, a fast shutdown sequence is used for the accelerated code
;The fast shutdown sequence doesn't free each allocated block, but lets
;the Zend Engine Memory Manager do the work.
opcache.fast_shutdown=1

;Enables the OPcache for the CLI version of PHP.
opcache.enable_cli=1

Jeśli korzystasz z dowolnej biblioteki lub kodu korzystającego z adnotacji kodu, musisz włączyć zapisywanie komentarzy:

opcache.save_comments=1

Jeśli wyłączone, wszystkie komentarze PHPDoc są usuwane z kodu, aby zmniejszyć rozmiar zoptymalizowanego kodu. Wyłączenie „Komentarze do dokumentu” może uszkodzić niektóre istniejące aplikacje i struktury (np. Doctrine, ZF2, PHPUnit)

Danack
źródło
4
Czy są to zalecane ustawienia dla środowisk produkcyjnych, programowania lub obu tych elementów?
marcvangend
1
Być może nieporozumienie z mojej strony, czym dokładnie jest opcache i do czego służy, ale skonfigurowałem go i przetestowałem za pomocą skryptu stanu PeeHaa poniżej. Wszystko działa. Ale wciąż zadaję pytanie OP. "Jak tego użyć?" To nie jest do buforowania widoków i tak jest?
isimmons 10.10.2013
3
@isimmons „OPcache poprawia wydajność PHP, przechowując prekompilowany kod bajtowy skryptu we wspólnej pamięci, eliminując w ten sposób konieczność ładowania i analizowania skryptów przez PHP przy każdym żądaniu”.
Danack 10.10.2013
1
@marcvangend Dobra uwaga! Myślę, że buforowanie ma sens tylko w produkcji, więc te konfiguracje to prawdopodobnie ustawienia produkcyjne.
Sliq,
3
Czy ktoś może wyjaśnić, dlaczego zalecana wydajność ustawień jest gorsza niż domyślna lub kiedy powinien zacząć działać?
RP
19

Zamierzam wpłacić moje dwa centy za to, czego używam opcache.

Stworzyłem rozbudowane środowisko z wieloma polami oraz metodami sprawdzania poprawności i wyliczeniami, aby móc rozmawiać z moją bazą danych.

Bez opcache

Kiedy korzystam z tego skryptu bez opcache i przesyłam 9000 żądań w 2,8 sekundy do serwera apache, maksymalizuje on przy 90-100% procesora przez 70-80 sekund, aż do momentu, gdy nadąży za wszystkimi żądaniami.

Total time taken: 76085 milliseconds(76 seconds)

Z włączoną opcache

Po włączeniu opcache działa z prędkością 25-30% procesora przez około 25 sekund i nigdy nie przekracza 25% wykorzystania procesora.

Total time taken: 26490 milliseconds(26 seconds)

Zrobiłem plik czarnej listy opcache, aby wyłączyć buforowanie wszystkiego oprócz frameworka, który jest statyczny i nie wymaga zmiany funkcjonalności. Wybieram wprost tylko pliki frameworka, abym mógł się rozwijać bez martwienia się o ponowne ładowanie / sprawdzanie poprawności plików pamięci podręcznej. Posiadanie wszystkiego w pamięci podręcznej oszczędza sekundę w sumie żądań25546 milliseconds

To znacznie zwiększa ilość danych / żądań, które mogę obsłużyć na sekundę, nawet jeśli serwer nawet nie poci się.

Tschallacka
źródło
3
zend_extension=php_opcache.dll; 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; opcache.blacklist_filename="C:\xampp\php\cfg\opcache.blacklist;Wystarczy wymienić; z enter w pliku ini. Ale tego właśnie użyłem. głównie domyślne rzeczy
Tschallacka
1
btw, ja uruchamiając to z memcache, wykonując 2100 żądań bazy danych, sekunda uruchamia skrypt, którego używam w ciągu 150 mikrosekund (około
1/6
1
Opcache buforuje pliki php w skompilowanej formie w pamięci. Więc nie masz już narzutu czytania z dysku oraz kompilacji i optymalizacji plików przez parser php. Pamięć podręczna to coś, czego można użyć do przechowywania zmiennych między sesjami. Powiedzmy na przykład, że użytkownik ma skrypt aktualizacji, który żąda tych samych parametrów przez 10 sekund, podczas gdy użytkownik patrzy na ekran. Możesz użyć pamięci podręcznej pamięci do jednokrotnego skompilowania zapytania, a następnie nadal żądać skompilowanego zapytania z pamięci zamiast regenerować go.
Tschallacka
2
nie ma. opcache.revalidate_freq=60;określa, jak długo plik może żyć w pamięci w sekundach. gdy czas minie, kompiluje plik.
Tschallacka
3
W rzeczywistości opcache.revalidate_freqkontroluje, jak często skrypt jest sprawdzany pod kątem zmian (na podstawie tego, czy zmienił się jego znacznik czasu). Jeśli więc znacznik czasu skryptu pozostaje taki sam, jak podczas ostatniej kompilacji, nie zostanie ponownie skompilowany. Wszystko to przy założeniu, że nie zmieniłeś opcache.validate_timestampsustawienia, które jest domyślnie włączone.
jjlin
4

Z PHP 5.6 na Amazon Linux (powinno być tak samo na RedHat lub CentOS):

yum install php56-opcache

a następnie uruchom ponownie apache.

Roger Dueck
źródło
2

Napotkałem to podczas konfigurowania Moodle. Dodałem następujące wiersze w pliku php.ini.

zend_extension=C:\xampp\php\ext\php_opcache.dll

[opcache]
opcache.enable = 1
opcache.memory_consumption = 128
opcache.max_accelerated_files = 4000
opcache.revalidate_freq = 60

; Required for Moodle
opcache.use_cwd = 1
opcache.validate_timestamps = 1
opcache.save_comments = 1
opcache.enable_file_override = 0

; If something does not work in Moodle
;opcache.revalidate_path = 1 ; May fix problems with include paths
;opcache.mmap_base = 0x20000000 ; (Windows only) fix OPcache crashes with event id 487

; Experimental for Moodle 2.6 and later
;opcache.fast_shutdown = 1
;opcache.enable_cli = 1 ; Speeds up CLI cron
;opcache.load_comments = 0 ; May lower memory use, might not be compatible with add-ons and other apps

extension=C:\xampp\php\ext\php_intl.dll

[intl]
intl.default_locale = en_utf8
intl.error_level = E_WARNING

intl -> http://php.net/manual/en/book.intl.php

Anoop Toffy
źródło
1
Warto zauważyć, że te ustawienia są udokumentowane tutaj: docs.moodle.org/30/en/OPcache
sierrasdetandil
opcache.fast_shutdown = 0 github.com/zendtech/ZendOptimizerPlus/issues/146
Yousha Aleayoub,