¿Cómo usar PHP OPCache?


249

Se ha lanzado PHP 5.5 y presenta un nuevo módulo de almacenamiento en caché de código llamado OPCache, pero no parece haber ninguna documentación para ello.

Entonces, ¿dónde está la documentación y cómo uso OPcache?




Lástima que la documentación NO nos diga cómo compilar opcache correctamente / deshabilitarlo ni solucionar la autoconfiguración de la fuente PHP 5.6.24+, ¡para que PHP compile! :-(
Filip OvertoneSinger Rydlo

@ Fred-ii- "Hay muchas configuraciones que pueden necesitar ajustes. Comprender cómo funciona e identificar problemas durante la fase de estabilización del proceso de lanzamiento de PHP 5.5 será de gran ayuda". ... Esa publicación de blog no es muy útil. No explica cómo entender cómo funciona o cómo ajustar mejor la configuración :(
icc97

Respuestas:


371

Instalación

OpCache se compila por defecto en PHP5.5 +. Sin embargo, está deshabilitado de forma predeterminada. Para comenzar a usar OpCache en PHP5.5 + primero deberá habilitarlo. Para hacer esto, tendría que hacer lo siguiente.

Agregue la siguiente línea a su php.ini:

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

Tenga en cuenta que cuando la ruta contiene espacios, debe envolverla entre comillas:

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

También tenga en cuenta que tendrá que usar la zend_extensiondirectiva en lugar de la directiva "normal" extensionporque afecta el motor Zend real (es decir, lo que ejecuta PHP).

Uso

Actualmente hay cuatro funciones que puede usar:

opcache_get_configuration():

Devuelve una matriz que contiene la configuración utilizada actualmente por OpCache. Esto incluye todas las configuraciones ini, así como información de versión y archivos en la lista negra.

var_dump(opcache_get_configuration());

opcache_get_status():

Esto devolverá una matriz con información sobre el estado actual de la memoria caché. Esta información incluirá cosas como: el estado en que se encuentra el caché (habilitado, reiniciando, lleno, etc.), el uso de memoria, aciertos, errores y alguna información más útil. También contendrá los scripts en caché.

var_dump(opcache_get_status());

opcache_reset():

Restablece todo el caché. Lo que significa que todos los scripts en caché posibles se analizarán nuevamente en la próxima visita.

opcache_reset();

opcache_invalidate():

Invalida un script en caché específico. Lo que significa que el script se analizará nuevamente en la próxima visita.

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

Mantenimiento e informes

Hay algunas GUI creadas para ayudar a mantener OpCache y generar informes útiles. Estas herramientas aprovechan las funciones anteriores.

OpCacheGUI

Descargo de responsabilidad Soy el autor de este proyecto

caracteristicas:

  • Estado de OpCache
  • Configuración de OpCache
  • Estadísticas de OpCache
  • OpCache reset
  • Descripción general de los scripts en caché
  • Invalidación de scripts en caché
  • Plurilingüe
  • Soporte para dispositivos móviles
  • Gráficos brillantes

Capturas de pantalla

estado

scripts en caché

gráficos

mobilr

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

opcache-status

caracteristicas:

  • Estado de OpCache
  • Configuración de OpCache
  • Estadísticas de OpCache
  • Descripción general de los scripts en caché
  • Fila india

Captura de pantalla:

estado

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

opcache-gui

caracteristicas:

  • Estado de OpCache
  • Configuración de OpCache
  • Estadísticas de OpCache
  • OpCache reset
  • Descripción general de los scripts en caché
  • Invalidación de scripts en caché
  • Actualización automática

Captura de pantalla:

opcache-gui-overview

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


66
¿Algo relacionado con PHP-CLI? ¿Cómo lo utiliza CLI? Cuando se reinicia FPM, OPCache se restablece: ¿también afecta a OPCache de CLI? ¿El OPCache de CLI está separado o comparte el mismo grupo de caché con FPM? ¡Gracias!
Shahriyar Imanov

3
OpCache estaba habilitado de forma predeterminada para mí en mi instalación más reciente en ubuntu 14.04, apache 2.4.7, php 5.5.9.
jstats

hola, en su tercera captura de pantalla, cache_full es falso, supongo que está relacionado con el almacenamiento en caché de la página completa, ¿podría decirme cómo activarlo? (
Hazlo

Estoy equivocado, eso no es para almacenar en caché la página completa, pero se mostrará como verdadero si la memoria que usa la memoria caché está llena. ¡Gracias de todos modos!
brucekaushik

zend_extension = C: \ path \ to \ php_opcache.dll (win) - Agregar esta línea en php.ini funciona bien.
kalidasan

152

OPcache reemplaza a APC

Debido a que OPcache está diseñado para reemplazar el módulo APC, no es posible ejecutarlos en paralelo en PHP. Esto está bien para almacenar en caché el código de operación PHP, ya que ninguno de los dos afecta la forma en que escribe el código.

Sin embargo, significa que si actualmente está utilizando APC para almacenar otros datos (a través de la apc_store()función), no podrá hacerlo si decide utilizar OPCache.

Deberá usar otra biblioteca, como APCu o Yac, que almacenan datos en la memoria compartida de PHP, o cambiar para usar algo como memcached, que almacena datos en la memoria en un proceso separado para PHP.

Además, OPcache no tiene equivalente del medidor de progreso de carga presente en APC. En su lugar, debe usar el Progreso de carga de la sesión .

Configuraciones para OPcache

La documentación para OPcache se puede encontrar aquí con todas las opciones de configuración enumeradas aquí . Las configuraciones recomendadas son:

; 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

Si usa una biblioteca o código que usa anotaciones de código, debe habilitar guardar comentarios:

opcache.save_comments=1

Si está deshabilitado, todos los comentarios de PHPDoc se eliminan del código para reducir el tamaño del código optimizado. Deshabilitar "Comentarios de Doc" puede romper algunas aplicaciones y marcos existentes (por ejemplo, Doctrine, ZF2, PHPUnit)


44
¿Son esos ajustes recomendados para entornos de producción, para desarrollo o ambos?
marcvangend

1
Tal vez un malentendido de mi parte sobre qué es exactamente el opcache y para qué se usa, pero lo configuré y probé con el script de estado de PeeHaa a continuación. Todo esta funcionando. Pero todavía estoy haciendo la pregunta de OP. "¿Cómo usarlo?" No es para almacenar en caché las vistas y las cosas, ¿verdad?
isimmons

3
@isimmons "OPcache mejora el rendimiento de PHP al almacenar el bytecode de script precompilado en la memoria compartida, eliminando así la necesidad de que PHP cargue y analice scripts en cada solicitud".
Danack

1
@marcvangend Buen punto! Creo que el almacenamiento en caché solo tiene sentido real en la producción, por lo que estas configuraciones son probablemente configuraciones de producción.
Sliq

3
¿Alguien puede explicar por qué el rendimiento de la configuración recomendada es peor que el predeterminado o cuándo deberían comenzar a dar efecto?
RP

19

Voy a dejar caer mis dos centavos por lo que uso opcache.

Hice un marco extenso con muchos campos y métodos de validación y enumeraciones para poder hablar con mi base de datos.

Sin opcache

Cuando utilizo este script sin opcache y envío 9000 solicitudes en 2.8 segundos al servidor apache, alcanza un máximo de 90-100% de CPU por 70-80 segundos hasta que alcanza todas las solicitudes.

Total time taken: 76085 milliseconds(76 seconds)

Con opcache habilitado

Con opcache habilitado, funciona con un tiempo de CPU del 25-30% durante aproximadamente 25 segundos y nunca supera el uso de CPU del 25%.

Total time taken: 26490 milliseconds(26 seconds)

He creado un archivo de lista negra opcache para deshabilitar el almacenamiento en caché de todo, excepto el marco, que es todo estático y no necesita un cambio de funcionalidad. Elijo explícitamente solo los archivos de marco para poder desarrollar sin preocuparme por recargar / validar los archivos de caché. Tener todo en caché ahorra un segundo en el total de las solicitudes25546 milliseconds

Esto amplía significativamente la cantidad de datos / solicitudes que puedo manejar por segundo sin que el servidor se preocupe.


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;Simplemente reemplace el; con una entrada en el archivo ini. Pero esto es lo que usé. sobre todo cosas por defecto
Tschallacka

1
por cierto, yo ejecuto esto con memcache haciendo 2100 solicitudes de base de datos un segundo ejecuta el script que uso dentro de 150 microsegundos (aproximadamente
1/6 de

1
Opcache almacena en caché los archivos php en forma compilada en la memoria. Por lo tanto, ya no tiene gastos generales de lectura desde el disco y la compilación y optimización de archivos por el analizador php. Memcache es algo que puede usar para almacenar variables entre sesiones. Sayt, por ejemplo, un usuario tiene un script de actualización que solicita los mismos parámetros durante 10 segundos mientras el usuario mira una pantalla. Puede usar la memoria caché de mem para compilar la consulta una vez, y luego seguir solicitando la consulta compilada desde la memoria en lugar de regenerarla.
Tschallacka

2
no lo hace opcache.revalidate_freq=60;determina cuánto tiempo puede vivir un archivo en la memoria en segundos. cuando se acabe el tiempo, vuelve a compilar el archivo.
Tschallacka

3
En realidad, opcache.revalidate_freqcontrola con qué frecuencia se verifica la secuencia de comandos en busca de cambios (en función de si cambió su marca de tiempo). Por lo tanto, si la marca de tiempo de un script sigue siendo la misma que la última vez que se compiló, no se volverá a compilar. Todo esto supone que no ha cambiado la opcache.validate_timestampsconfiguración, que está habilitada de forma predeterminada.
jjlin

4

Con PHP 5.6 en Amazon Linux (debería ser el mismo en RedHat o CentOS):

yum install php56-opcache

y luego reinicie apache.


2

Encontré esto al configurar moodle. Agregué las siguientes líneas en el archivo 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 señalar que esta configuración está documentada aquí: docs.moodle.org/30/en/OPcache
sierrasdetandil

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.