Come usare PHP OPCache?


249

PHP 5.5 è stato rilasciato e presenta un nuovo modulo di memorizzazione nella cache del codice chiamato OPCache, ma non sembra esserci alcuna documentazione per esso.

Allora, dove è la documentazione per esso e come posso usare OPcache?




Peccato che la Documentazione NON ci dica come compilare correttamente Opcache / disabilitarlo né aggirare l'autoconf della fonte PHP 5.6.24+, in modo che PHP si compili! :-(
Filip OvertoneSinger Rydlo,

@ Fred-ii- "Ci sono molte impostazioni che potrebbero dover essere modificate. Comprendere come funziona e identificare i problemi durante la fase di stabilizzazione del processo di rilascio di PHP 5.5 sarà di grande aiuto." ... Quel post sul blog non è molto utile. Non spiega come capire come funziona o come regolare al meglio le impostazioni :(
icc97

Risposte:


371

Installazione

OpCache è compilato per impostazione predefinita su PHP5.5 +. Tuttavia è disabilitato per impostazione predefinita. Per iniziare a usare OpCache in PHP5.5 + dovrai prima abilitarlo. Per fare questo dovresti fare quanto segue.

Aggiungi la seguente riga al tuo php.ini:

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

Si noti che quando il percorso contiene spazi, è necessario racchiuderlo tra virgolette:

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

Nota anche che dovrai usare la zend_extensiondirettiva invece della direttiva "normale" extensionperché influenza l'attuale motore Zend (cioè la cosa che esegue PHP).

uso

Attualmente ci sono quattro funzioni che puoi usare:

opcache_get_configuration():

Restituisce un array contenente la configurazione attualmente utilizzata da OpCache. Ciò include tutte le impostazioni ini nonché le informazioni sulla versione e i file nella lista nera.

var_dump(opcache_get_configuration());

opcache_get_status():

Ciò restituirà un array con informazioni sullo stato corrente della cache. Queste informazioni includeranno cose come: lo stato in cui si trova la cache (abilitato, riavvio, completo ecc.), L'utilizzo della memoria, hit, mancate e alcune informazioni più utili. Conterrà anche gli script memorizzati nella cache.

var_dump(opcache_get_status());

opcache_reset():

Reimposta l'intera cache. Ciò significa che tutti i possibili script memorizzati nella cache verranno analizzati nuovamente alla visita successiva.

opcache_reset();

opcache_invalidate():

Invalida uno specifico script memorizzato nella cache. Ciò significa che la sceneggiatura verrà analizzata di nuovo alla visita successiva.

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

Manutenzione e rapporti

Esistono alcune GUI create per aiutare a mantenere OpCache e generare utili report. Questi strumenti sfruttano le funzioni di cui sopra.

OpCacheGUI

Disclaimer Sono l'autore di questo progetto

Caratteristiche:

  • Stato di OpCache
  • Configurazione di OpCache
  • Statistiche di OpCache
  • Ripristino di OpCache
  • Panoramica degli script memorizzati nella cache
  • Annullamento degli script nella cache
  • plurilingue
  • Supporto per dispositivi mobili
  • Grafici lucidi

Screenshots:

stato

cache-scripts

grafici

mobilr

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

opcache-status

Caratteristiche:

  • Stato di OpCache
  • Configurazione di OpCache
  • Statistiche di OpCache
  • Panoramica degli script memorizzati nella cache
  • File singolo

Immagine dello schermo:

stato

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

opcache-gui

Caratteristiche:

  • Stato di OpCache
  • Configurazione di OpCache
  • Statistiche di OpCache
  • Ripristino di OpCache
  • Panoramica degli script memorizzati nella cache
  • Annullamento degli script nella cache
  • Aggiornamento automatico

Immagine dello schermo:

opcache-gui-Panoramica

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


6
Qualcosa riguardo a PHP-CLI? Come la CLI lo utilizza? Al riavvio di FPM, OPCache si reimposta: influisce anche su OPCache della CLI? OPCache della CLI è separato o condivide lo stesso pool di cache con FPM? Grazie!
Shahriyar Imanov,

3
OpCache è stato abilitato per impostazione predefinita sulla mia installazione più recente su Ubuntu 14.04, Apache 2.4.7, PHP 5.5.9.
jstats,

ciao, nel tuo terzo screenshot, cache_full è falso, presumo sia correlato alla memorizzazione nella cache a pagina intera, potresti per favore dirmi come attivarlo? (
rendilo

Sbaglio, non è per la memorizzazione nella cache della pagina intera, ma verrà visualizzato come vero se la memoria utilizzata dalla cache è piena. Grazie comunque!
Brucekaushik,

zend_extension = C: \ path \ to \ php_opcache.dll (win) - L'aggiunta di questa riga in php.ini funziona correttamente.
kalidasan,

152

OPcache sostituisce APC

Poiché OPcache è progettato per sostituire il modulo APC, non è possibile eseguirli in parallelo in PHP. Questo va bene per la memorizzazione nella cache del codice operativo PHP in quanto nessuno dei due influenza il modo in cui si scrive il codice.

Tuttavia, significa che se si sta utilizzando APC per archiviare altri dati (tramite la apc_store()funzione) non sarà possibile farlo se si decide di utilizzare OPCache.

Dovrai utilizzare un'altra libreria come APCu o Yac che entrambi memorizzano i dati nella memoria PHP condivisa o passare a utilizzare qualcosa come memcached, che memorizza i dati in memoria in un processo separato in PHP.

Inoltre, OPcache non ha un equivalente dell'indicatore di avanzamento del caricamento presente in APC. Dovresti invece utilizzare l' avanzamento del caricamento della sessione .

Impostazioni per OPcache

La documentazione per OPcache è disponibile qui con tutte le opzioni di configurazione elencate qui . Le impostazioni consigliate sono:

; 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

Se si utilizza una libreria o un codice che utilizza annotazioni di codice, è necessario abilitare i commenti di salvataggio:

opcache.save_comments=1

Se disabilitato, tutti i commenti PHPDoc vengono eliminati dal codice per ridurre le dimensioni del codice ottimizzato. La disabilitazione di "Commenti doc" potrebbe interrompere alcune applicazioni e framework esistenti (ad es. Doctrine, ZF2, PHPUnit)


4
Sono le impostazioni consigliate per gli ambienti di produzione, per lo sviluppo o per entrambi?
marcvangend,

1
Forse un malinteso da parte mia su cosa sia esattamente opcache ea cosa serve ma l'ho configurato e testato con lo script di stato PeeHaa di seguito. Funziona tutto. Ma sto ancora ponendo la domanda del PO. "Come usarlo?" Non è per la memorizzazione nella cache delle viste e le cose sono?
Isimmons,

3
@isimmons "OPcache migliora le prestazioni di PHP memorizzando il bytecode degli script precompilato nella memoria condivisa, eliminando così la necessità che PHP carichi e analizzi gli script su ogni richiesta."
Danack,

1
@marcvangend Ottimo punto! Penso che la memorizzazione nella cache abbia un senso reale nella produzione, quindi queste configurazioni sono probabilmente impostazioni di produzione.
Sliq,

3
Qualcuno può spiegare perché le prestazioni delle impostazioni consigliate sono peggiori del valore predefinito o quando dovrebbero iniziare a dare effetto?
RP

19

Ho intenzione di buttare i miei due centesimi per quello che uso opcache.

Ho creato un ampio framework con molti campi, metodi di convalida ed enumerazioni per poter parlare con il mio database.

Senza opcache

Quando utilizzo questo script senza opcache e invio 9000 richieste in 2,8 secondi al server apache, esso raggiunge il 90-100% cpu per 70-80 secondi fino a quando non raggiunge tutte le richieste.

Total time taken: 76085 milliseconds(76 seconds)

Con opcache abilitato

Con opcache abilitato gira al 25-30% di cpu per circa 25 secondi e non supera mai il 25% di cpu.

Total time taken: 26490 milliseconds(26 seconds)

Ho creato un file blacklist opcache per disabilitare la memorizzazione nella cache di tutto tranne il framework, che è tutto statico e non necessita di modifiche di funzionalità. Ho scelto esplicitamente solo i file del framework in modo da poterlo sviluppare senza preoccuparmi di ricaricare / convalidare i file della cache. Avere tutto nella cache consente di risparmiare un secondo sul totale delle richieste25546 milliseconds

Ciò espande in modo significativo la quantità di dati / richieste che posso gestire al secondo senza che il server si rompa il sudore.


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;Sostituisci semplicemente il; con un invio nel file ini. Ma questo è quello che ho usato. principalmente roba di default
Tschallacka,

1
a proposito, io sto eseguendo questo con memcache facendo 2100 richieste di database al secondo esegue lo script che uso entro 150 microsecondi (circa 1/6 di millisecondo)
Tschallacka,

1
Opcache memorizza nella cache i file php in forma compilata in memoria. Quindi non hai più il sovraccarico di leggere dal disco e compilare e ottimizzare i file dal parser php. Memcache è qualcosa che puoi usare per memorizzare variabili tra le sessioni. Diciamo ad esempio che un utente ha uno script di aggiornamento che richiede gli stessi parametri per 10 secondi mentre l'utente fissa ascreen. È possibile utilizzare la cache mem per compilare una volta la query, quindi continuare a richiedere la memoria compilata dalla memoria non è possibile rigenerarla.
Tschallacka,

2
non lo fa. opcache.revalidate_freq=60;determina la durata della memoria di un file in secondi. allo scadere del tempo ricompila il file.
Tschallacka,

3
In realtà, opcache.revalidate_freqcontrolla la frequenza con cui uno script viene verificato per le modifiche (in base alla modifica del timestamp). Quindi, se il timestamp di uno script rimane lo stesso dell'ultima volta che è stato compilato, non verrà ricompilato. Tutto questo presuppone che non sia stata modificata l' opcache.validate_timestampsimpostazione, abilitata per impostazione predefinita.
jjlin,

4

Con PHP 5.6 su Amazon Linux (dovrebbe essere lo stesso su RedHat o CentOS):

yum install php56-opcache

e quindi riavviare apache.


2

L'ho riscontrato durante l'impostazione di Moodle. Ho aggiunto le seguenti righe nel file 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


1
Vale la pena notare che queste impostazioni sono documentate qui: docs.moodle.org/30/en/OPcache
sierrasdetandil

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.