2013-07-18 11 views

Odpowiedz

11

zend_accelerator_module.c deklaruje dwie udokumentowane wywołania API: opcache_reset() i opcache_invalidate() jak również te dwa nieudokumentowane: opcache_get_status() i opcache_get_configuration(). To, co robią, jest dość oczywiste ze źródła.

Po wydaniu opcache_reset() będzie to miało zastosowanie tylko do pamięci podręcznej OPCache, która jest podłączona do procesu, który wykonuje skrypt PHP. I tak, możesz mieć wiele takich pamięci podręcznych w systemie.

Po zgłoszeniu opcache.enable_cli=1 na żądanie php-cli, OPcache wyda żądanie restartu pamięci podręcznej, która jest połączona z tym procesem; niestety cli SAPI tworzy prywatną pamięć podręczną, więc to nie robi wiele dobrego.

Najważniejszą kwestią do zrozumienia w systemach * nix jest fakt, że OPcache opiera się na kilku podstawowych procesach zarządzania, takich jak Apache lub FPM, na uruchamianiu OPcache, co powoduje, że jest to mmap() SMA, który zawiera pamięć podręczną. Menedżer procesów następnie wyświetla widma procesów podrzędnych, które obsługują żądania, a także przypadkowo dziedziczą region z mapą nadrzędną od obiektu nadrzędnego.

Więc jeśli chcesz zresetować pamięć podręczną OPcache podłączoną do PHP-FPM, musisz to zrobić poprzez skrypt działający pod usługą PHP-FPM. To musi być tylko 4-liniowy. Jeśli chcesz to zrobić z poziomu wiersza poleceń, możesz użyć skryptu wget, curl lub skryptu PHP CLI, który używa rozszerzenia curl do zainicjowania tego skryptu FPM.

Należy jednak pamiętać o użyciu silnego mechanizmu uwierzytelniania między tymi dwoma urządzeniami, aby uniemożliwić korzystanie z usług osób trzecich.

Jeśli chcesz zrozumieć trochę więcej, zrobiłem ten przegląd: The Zend Engine and opcode caching. Jeśli masz jakieś uwagi lub pytania, to skomentuj tutaj lub prześlij zgłoszenie na Github.

+0

Bardzo dziękuję za szczegółowe wyjaśnienie. * Rozwiązanie * poprzez stworzenie skryptu i uruchomienie go poprzez curl jest proste, ale nie jest w porządku, a przynajmniej nie jest tak proste, jak mogłoby być. – schickling

+1

Możesz również ponownie załadować php-fpm, to zrobi wdzięczny restart i powinien wyczyścić opcache. – leeb

0

Zobacz, czy ta metoda jest dostępna z function_exists w twoim środowisku.

if(function_exists('opcache_reset')) echo 'yay!'; 

Whiles jest ona dostępna w PHP5.5 ponieważ opcache pochodzi z niego, powinien on również stać się dostępna, jeśli masz zainstalowane OpCache do starszej wersji PHP. Wierzę, że to jest to, co docs docs, gdy mówi PHP (PHP 5 >= 5.5.0, PECL ZendOpcache >= 7.0.0).

Użyłem też tego szybkiego i brudnego control panel z PHP 5.4 pomyślnie (używa metod opcache_ *).

Edycja Po obejrzeniu powyższego panelu sterowania, zauważyłem, że sprawdza wersję PHP i czy istnieje opcache_reset.

Wygląda na to, że próbuję użyć funkcji accelerator_*, a nie opcache_*.

Sugeruję wypróbowanie tego skryptu, aby sprawdzić, czy to działa, a następnie możemy pracować wstecz, aby zobaczyć, co jest zainstalowane dokładnie na serwerze i jakie metody należy zastosować.

+0

Dzięki za odpowiedź! Funkcje istnieją, ale nie wydają się działać. Czy uprawnienia (który użytkownik uruchamia 'opcache_reset') odgrywają rolę? – schickling

+0

Świetne pytanie, nie jestem pewien. Czy możesz wypróbować używanie skryptu php połączonego z serwerem i sprawdzić, czy działa? Na koniec, jakich ustawień INI użyłeś? Jesteś pewny, że zaczynają działać? (jaki jest czas wygaśnięcia pamięci podręcznej?) – fideloper

+0

Czyszczenie pamięci podręcznej przy użyciu skryptu działa. Działa jako "www-data" php -r "echo function_exists (" opcache_reset ")? Opcache _ ':(function_exists (" accelerator_reset ")?' Akcelerator _ ':' ');" 'zwraca' opcache_'. Używam PHP-FPM z nginxem – schickling

0

Jeśli masz witrynę WordPress na swoim serwerze, zainstaluj wtyczkę OPcache Dashboard. Zapewnia interaktywną kontrolę, a także uruchamia resetowanie pamięci podręcznej po uruchomieniu automatycznego procesu uaktualniania Wordpress.

Inną rzeczą, na którą warto zwrócić uwagę na serwerze z wieloma instancjami tego samego systemu CMS, jest sytuacja, w której działają różne wersje CMS lub wtyczek. Tak by się stało np. jeśli zataczasz ulepszenia głównych wersji. W tym przypadku php.ini musi zawierać

opcache.use_cwd=1 

tak samo nazwa pliku zostanie skompilowany oddzielnie w zależności od katalogu jest to. Jeśli jesteś pewien wasze wersje CMS są identyczne we wszystkich miejscach, można ustawić go do 0 i uzyskaj przyrosty wydajności, ponieważ OpCache skompiluje każdą procedurę raz, a następnie wyświetli ją dla wszystkich instancji CMS na twoim serwerze. Jest to również zwiększenie wydajności pamięci i byłoby całkiem znaczące, jeśli masz dużą liczbę instancji na farmie WP.

Powiązane problemy