Una interfaz limpia y responsiva para la información de Zend OPcache, que muestra estadísticas, configuraciones y archivos en caché, y proporciona una actualización en tiempo real de la información.
Esta interfaz utiliza ReactJS y Axios, es para navegadores modernos y requiere un mínimo de PHP 7.1.
MIT: http://acollington.mit-license.org/
Si puedes y te gustaría patrocinar este trabajo de alguna manera, sería fantástico. Puedes hacerlo a través de la página de patrocinio de GitHub.
Alternativamente, si quieres mencionarme en X (también conocido como Twitter) para decirme que lo usas, ¡eso también sería fantástico! (¿Alguien más extraña las postales?)
Hay dos formas de comenzar a utilizar esta interfaz gráfica de usuario:
La forma más fácil de comenzar a usar opcache-gui es clonar este repositorio, o simplemente copiar/pegar/descargar el archivo index.php
en una ubicación que su servidor web pueda cargar. Luego, apunte su navegador a esa ubicación, como https://www.example.com/opcache/index.php
.
Puede incluir los archivos con Composer ejecutando el comando composer require amnuts/opcache-gui
.
Una vez que esté en su directorio vendor
, existen numerosas formas en las que puede utilizar la interfaz. Por ejemplo, si estás usando un framework como Symfony o Laravel, puedes cargar opcache-gui en un Controller
. Sus requisitos para configurarlo dentro del marco de su elección variarán, por lo que no es realmente posible detallar cómo hacerlo en este archivo Léame... ¡pero tengo fe en su capacidad para resolverlo!
El espacio de nombres utilizado para la clase es AmnutsOpcache
, por lo que una vez que la dependencia esté en su autoload.php
puede usar la clase AmnutsOpcacheService
. Por ejemplo, podrías hacer algo como:
<?php
use Amnuts Opcache Service ;
// assuming location of: /var/www/html/opcache.php
require_once __DIR__ . ' /../vendor/autoload.php ' ;
// specify any options you want different from the defaults, if any
$ options = [ /* ... */ ];
// setup the class and pass in your options, if you have any
$ opcache = ( new Service ( $ options ))-> handle ();
Luego puede crear cualquier vista que desee para mostrar los detalles de opcache. Aunque hay una interfaz bastante clara basada en React disponible para usted en este repositorio.
Alternativamente, incluya vendor/amnuts/opcache-gui/index.php
directamente y esto le dará el mismo resultado que simplemente copiar/pegar el index.php
en algún lugar.
<?php
// assuming location of: /var/www/html/opcache.php
require_once __DIR__ . ' /../vendor/amnuts/opcache-gui/index.php ' ;
Incluso podrías simplemente crear un enlace simbólico al index.php
que se encuentra en el directorio vendor
:
ln -s /var/www/vendor/amnuts/opcache-gui/index.php /var/www/html/opcache.php
Básicamente, hay muchas formas de poner en funcionamiento la interfaz: elija la que se adapte a sus necesidades.
La configuración predeterminada para la interfaz se ve así:
$ options = [
' allow_filelist ' => true , // show/hide the files tab
' allow_invalidate ' => true , // give a link to invalidate files
' allow_reset ' => true , // give option to reset the whole cache
' allow_realtime ' => true , // give option to enable/disable real-time updates
' refresh_time ' => 5 , // how often the data will refresh, in seconds
' size_precision ' => 2 , // Digits after decimal point
' size_space ' => false , // have '1MB' or '1 MB' when showing sizes
' charts ' => true , // show gauge chart or just big numbers
' debounce_rate ' => 250 , // milliseconds after key press to send keyup event when filtering
' per_page ' => 200 , // How many results per page to show in the file list, false for no pagination
' cookie_name ' => ' opcachegui ' , // name of cookie
' cookie_ttl ' => 365 , // days to store cookie
' datetime_format ' => ' D, d M Y H:i:s O ' , // Show datetime in this format
' highlight ' => [
' memory ' => true , // show the memory chart/big number
' hits ' => true , // show the hit rate chart/big number
' keys ' => true , // show the keys used chart/big number
' jit ' => true // show the jit buffer chart/big number
],
// json structure of all text strings used, or null for default
' language_pack ' => null
];
Si desea cambiar alguno de los valores predeterminados, puede pasar solo los que desea cambiar si desea mantener el resto como está. Simplemente modifique la matriz en la parte superior del script index.php
(o pase la matriz de manera diferente a la clase Service
).
Por ejemplo, lo siguiente cambiaría solo los valores de allow_reset
y refresh_time
pero mantendría todo lo demás como predeterminado:
$ opcache = ( new Service ([
' refresh_time ' => 2 ,
' allow_reset ' => false
]))-> handle ();
O este ejemplo para darle a las pestañas una sensación un poco más "pirata":
$ opcache = ( new Service ([
' language_pack ' => <<<EOJSON
{
"Overview": "Crows nest",
"Cached": "Thar Booty",
"Ignored": "The Black Spot",
"Preloaded": "Ready an' waitin', Cap'n",
"Reset cache": "Be gone, yer scurvy dogs!",
"Enable real-time update": "Keep a weathered eye",
"Disable real-time update": "Avert yer eyes, sea dog!"
}
EOJSON
]))-> handle ();
La descripción general le mostrará toda la información principal. Desde aquí podrás ver en qué host y plataforma estás ejecutando, qué versión de OPcache estás usando, cuándo se restableció por última vez, las funciones y directivas disponibles (con enlaces al manual de php.net), y todas las estadísticas asociadas con OPcache (número de visitas, memoria utilizada, memoria libre y desperdiciada, y más).
Todos los archivos actualmente en el caché se enumeran aquí con sus estadísticas asociadas.
Puede filtrar los resultados para ayudar a encontrar los scripts particulares que está buscando y cambiar la forma en que se ordenan los archivos en caché. Desde aquí puede invalidar el caché de archivos individuales o invalidar el caché de todos los archivos que coincidan con su búsqueda.
Si no desea mostrar la lista de archivos en absoluto, puede utilizar la opción de configuración allow_filelist
; establecerlo en false
suprimirá la lista de archivos por completo.
Si desea ajustar la longitud de la paginación, puede hacerlo con la opción de configuración per_page
.
Si ha configurado una lista de archivos que no desea almacenar en caché al proporcionar un valor opcache.blacklist_filename
, la lista de archivos aparecerá en esta pestaña.
Si no ha proporcionado esa opción de configuración en el archivo php.ini
, esta pestaña no se mostrará. Si establece la opción de configuración allow_filelist
en false
, esta pestaña no se mostrará independientemente de su configuración ini.
PHP 7.4 introdujo la capacidad de precargar un conjunto de archivos al iniciar el servidor mediante la configuración opcache.preload
en su archivo php.ini
. Si lo ha configurado, la lista de archivos específicamente precargados aparecerá en esta pestaña.
Al igual que con el archivo ignorado, si no ha proporcionado la configuración ini o la opción de configuración allow_filelist
es false
, esta pestaña no se mostrará.
Puede restablecer todo el caché y forzar la invalidación de archivos individuales o grupos de archivos para que se vuelvan a almacenar en caché.
El reinicio se puede desactivar con el uso de las opciones de configuración allow_reset
y allow_invalidate
.
La interfaz puede sondear de vez en cuando para obtener una nueva visión del opcache. Puedes cambiar la frecuencia con la que esto sucede con la opción de configuración refresh_time
, que está en segundos.
Cuando las actualizaciones en tiempo real estén activas, la interfaz actualizará automáticamente todos los valores según sea necesario.
Además, si elige invalidar algún archivo o restablecer el caché, lo hará sin recargar la página, por lo que el término de búsqueda que ingresó o la página a la que navegó no se restablecerán. Si la actualización en tiempo real no está activada, la página se recargará ante cualquier uso de invalidación.
La interfaz ha sido diseñada según el principio de tener un solo archivo que cualquiera necesita para comenzar a funcionar. Para cumplir con esto, hay un archivo de plantilla, archivos de idioma, jsx y css, que se utilizan para crear la interfaz y se combinan en el proceso de construcción.
Este proceso de compilación le permitirá cambiar el idioma utilizado, cómo se incluyen las bibliotecas de JavaScript de terceros requeridas, la apariencia o incluso los componentes principales, si lo desea.
Para ejecutar el proceso de compilación, ejecute el comando php ./build/build.php
desde la raíz del repositorio (necesitará nodejs
y npm
ya instalados). Una vez ejecutado, debería ver un resultado similar a:
Installing node modules
Building js and css
Creating single build file
Using remote js links from 'cloudflare'
Done!
El script de compilación solo necesitará instalar node_modules
una vez, por lo que en compilaciones posteriores debería ser un poco más rápido.
El proceso de compilación creará un archivo CSS compilado en build/interface.css
y el javascript de la interfaz estará en build/interface.js
. Probablemente podría utilizar ambos dentro de sus propios marcos y sistemas de plantillas, si lo desea.
El CSS de la interfaz se encuentra en el archivo build/_frontend/interface.scss
. Realice cambios allí si desea cambiar los colores o el formato.
Si realiza algún cambio en el archivo scss, deberá ejecutar el script de compilación para poder ver los cambios.
Si desea cambiar la interfaz en sí, actualice el archivo build/_frontend/interface.jsx
; es básicamente un conjunto de componentes de ReactJS. Aquí es donde puedes cambiar el diseño del widget, cómo funciona la lista de archivos, la paginación, etc.
Ejecute el script de compilación nuevamente si realiza cambios aquí.
La plantilla PHP contenedora utilizada en el proceso de compilación, y que actúa para pasar varios bits de datos al lado de ReactJS, se encuentra en build/template.phps
. Si desea actualizar la versión de ReactJS utilizada, o cómo está estructurado el contenedor html (como querer pasar cosas adicionales al lado de ReactJS), entonces este sería el archivo que desearía actualizar.
La interfaz requiere algunos archivos js de terceros para funcionar correctamente. Tiene la opción de poder cambiar dónde se obtienen (entre CloudFare, JSDelivr y Unpkg), o puede tener js js completamente local y en línea (por ejemplo, tiene políticas de CSP implementadas y las URL remotas son no incluido en la lista blanca).
Para cambiar la ubicación de los recursos de terceros, use la opción -r
o --remote-js
seguida de cloudflare
, jsdelivr
o unpkg
. Por ejemplo, si quisiera usar jsdelivr , ejecutaría el comando de compilación de esta manera: php ./build/build.php -r jsdelivr
. El valor predeterminado es cloudflare
.
Si desea tener js en línea, puede usar el indicador -j
o --local-js
al compilar, como php ./build/build.php -j
. Esto buscará los archivos de script remotos e incrustará el js en el archivo principal index.php
. Si desea compilarlo nuevamente con archivos remotos, ejecute el comando nuevamente sin la bandera. Al recuperar los archivos se tendrá en cuenta la opción -r
si la proporciona.
Hay un viejo dicho que dice: "Si sabes más de un idioma, eres multilingüe; si no, eres británico". Esto no sólo es una crítica condenatoria a la mentalidad británica hacia otros idiomas, sino que también explica por qué la interfaz de usuario hasta ahora sólo ha estado en inglés, porque soy, a pesar de todos mis pecados, británico.
Sin embargo, ahora es posible crear la interfaz en un idioma diferente. Actualmente, gracias a los contribuyentes, también se admiten francés y español. Si alguien más quiere contribuir con paquetes de idiomas adicionales, envíe un PR.
Si el paquete de idioma está en el directorio build/_languages/
, puede usarlo con el indicador -l
o --lang
. Por ejemplo, si hay un paquete de idioma fr.json
, puede usar php ./build/build.php -l fr
para compilar con ese idioma.
Se han agregado algunos guiones de compositores para ayudar con la construcción. Son, composer build
, composer build-french
y composer build-spanish
.
Si desea crear un archivo de idioma, build/_languages/example.json
contiene todo lo que necesita. Es una estructura json simple en la que la clave es la versión en inglés que coincide con lo que hay en la interfaz de usuario, y el valor es a qué lo estás convirtiendo, que en el archivo de ejemplo está simplemente en blanco. Si un valor está vacío o el índice no existe para una traducción, entonces solo usará la versión en inglés. Esto le brinda la posibilidad de reemplazar algunas o todas las cadenas de la interfaz como mejor le parezca.
Para comenzar con un nuevo idioma, copie el archivo example.json
en el idioma que desee y que aún no exista, por ejemplo, pt-br.json
o pirate.json
. Luego complete las traducciones en los valores. Una vez hecho esto, reconstruya con php ./build/build.php -l pt-br
o php ./build/build.php -l pirate
.
Versión 3.5.5
Se agregaron traducciones al español gracias a @cvc90 (PR#110)
Versión 3.5.4
Mejor manejo de si JIT está habilitado o deshabilitado. Ahora también muestra por qué podría estar deshabilitado incluso si tiene la configuración activada. La interfaz también desactiva correctamente las estadísticas de gráficos y memoria para JIT si está desactivada por algún motivo.
Versión 3.5.3
Se solucionó algunas inconsistencias con los enlaces en la documentación de opcache en php.net.
Versión 3.5.2
Se eliminaron algunas advertencias para PHP 8.2 al eliminar el namespace
y las declaraciones use
en el archivo index.php
incluido.
Versión 3.5.1
Esto es solo 3.5.0 pero con etiquetas de versión corregidas para hacer feliz a Packagist y corregir mi error.
Versión 3.5.0
Esta versión cambia la forma en que el proceso de compilación incluye javascript.
-j
/ --local-js
ahora incorpora javascript en el archivo index.php
en lugar de tenerlos como archivos separados-r
/ --remote-js
para permitirle decidir de dónde obtiene los archivos de terceros (ya sea cuando se obtienen localmente o cuando se agregan como enlaces de script remotos), con cloudflare
, jsdelivr
o unpkg
disponibles. opciones Versión 3.4.0
Esta versión agrega un poco más de información sobre los archivos en el caché y permite un poco más de configuración a través del script de configuración y compilación.
datetime_format
para un formato flexible de los valores de fecha/hora.modified
del archivo en caché a la salida (cuando el archivo se agregó o actualizó)index.php
con los archivos js locales en lugar de las URL remotas. Versión 3.3.1
Sólo algunos ajustes menores:
Versión 3.3.0
Información JIT mayormente agregada para PHP 8:
false
Si desea habilitar JIT, debe ingresar un valor para la configuración ini opcache.jit_buffer_size; de lo contrario, estará deshabilitado de forma predeterminada.
Si no está utilizando PHP 8, la interfaz lo compensará y no mostrará la información JIT adicional.
Versión 3.2.1
Liberación de mantenimiento menor para:
Versión 3.2.0
Se actualizó ReactJS a las versiones minimizadas más recientes y utilizadas y se realizó una ligera mejora en la opción de clasificación cuando no hay paginación presente.
Versión 3.1.0
Se agregó la capacidad de ordenar la lista de archivos en caché de varias maneras.
Versión 3.0.1
Una actualización menor que utilizará http o https para obtener las bibliotecas de JavaScript, dependiendo de lo que esté usando.
Versión 3.0.0
Aunque la interfaz se ve prácticamente igual, ¡se ha reescrito completamente bajo el capó! Algunos de los cambios más notables son:
Versión 2.5.4
Ubicación refinada del espacio de nombres CSS inicial para que funcione bien dentro del complemento de Moodle y posiblemente en otros sistemas. También modificó algo de CSS.
Versión 2.5.3
Se agregaron nombres de clases CSS y se actualizaron las reglas de estilo para usarlos.
Versión 2.5.2
Revisión para los valores de nivel de optimización que se publicó en la versión 2.5.1.
Versión 2.5.1
Un par de correcciones de errores y mejoras en los detalles del nivel de optimización.
Versión 2.5.0
Se agregó un nuevo gráfico destacado para mostrar el porcentaje de claves almacenadas en caché con opciones para activar/desactivar los gráficos destacados individuales.
Versión 2.4.1
Principalmente correcciones de errores
memory_consumption
y max_file_size
ahora se muestran como tamaños legibles por humanosfile_cache_only
está activo Versión 2.4.0
Agrega un almacén de cookies para el estado en tiempo real, lo que permite activar el tiempo real al cargar. El nombre de la cookie y la longitud TTL se pueden ajustar en la configuración.
Versión 2.3.0
Agrega información para cadenas internas y compatibilidad con PHP 5.4.
Versión 2.2.2
Incorpora optimizaciones para la lista de archivos al filtrar.
Versión 2.2.1
¿Los medidores ahora se actualizan con el pulso en tiempo real y se solucionaron un par de problemas de redondeo?
Versión 2.2.0
Proporciona la posibilidad de activar/desactivar la lista de archivos (el valor predeterminado está activado)
Versión 2.1.0
Ahora proporciona una forma mucho más sencilla de configurar algunas opciones, ya sea la hora de la encuesta, alternar la capacidad de restablecer el caché, actualizaciones en tiempo real, etc. También le permite mostrar los valores grandes (uso de memoria y tasa de aciertos) como indicador. gráficos en lugar de números grandes.
Versión 2.0.0
Introduce el uso de React.js que brinda la capacidad de actualizar sin problemas más información en tiempo real (bueno, cada cinco segundos de forma predeterminada), por lo que ahora los archivos y la descripción general se actualizan. Hay una apariencia actualizada, eliminando los degradados y buscando una sensación más plana. Y el código en general ha sido revisado.
Las versiones de la GUI están disponibles en:
https://github.com/amnuts/opcache-gui/releases/
Varias personas han cuestionado si opcache-gui está funcionando en su instancia de PHP-FPM, ya que los archivos mostrados no parecen ser todo lo que está en caché, y eso es diferente a lo que podría mostrar Apache.
Básicamente, ese es el comportamiento esperado. Y gracias a un excelente comentario del colaborador Michalng, esta explicación debería cubrir la diferencia:
La interfaz solo puede mostrar lo que sabe sobre el uso de OPcache de su propia instancia de OPcache, por lo tanto, cuando se accede a través de Apache con mod_php, solo puede ver el uso de OPcache de esa instancia de OPcache del servidor web Apache. Cuando se accede con CGI clásico, solo puede verse almacenado en caché cuando se crea una nueva instancia de PHP y OPcache, en cuyo caso el propio OPcache a menudo no tiene sentido.
Para poder monitorear y administrar OPcache para todas las aplicaciones web, todas deben usar el mismo FastCGI, es decir, la instancia PHP-FPM.
En el caso de Apache, a menudo es necesario configurarlo activamente para no usar su mod_php interno sino enviar solicitudes de controlador PHP al servidor PHP-FPM compartido a través de mod_proxy_fcgi, lo que también requiere el uso del evento MPM. En general, esta se considera la configuración preferida hoy en día, especialmente para sitios web con mucho tráfico. Esto se debe a que cada solicitud entrante con MPM prefork + mod_php crea un proceso hijo propio que requiere tiempo y memoria adicionales, mientras que con el evento MPM y el servidor PHP-FPM dedicado se usa (generalmente) un hilo de controlador que ya está en espera en Apache y en PHP. casi no consume memoria ni tiempo adicional para la generación del proceso.
El script requiere PHP 7.1 o superior. No me siento tentado a degradar el código para hacerlo compatible con la versión 7.0 y, con suerte, la mayoría de la gente ya lo habrá actualizado. Pero realmente aprecio que a veces las personas simplemente no tienen la capacidad de cambiar la versión de PHP que usan porque está fuera de su control. Entonces, si eres uno de los desafortunados, puedes realizar los siguientes cambios en index.php
(o Service.php
y ejecutar el script de compilación). Para las líneas:
public function getOption(?string $name = null)
public function getData(?string $section = null, ?string $property = null)
public function resetCache(?string $file = null): bool
¿Será simplemente un caso de eliminar el ?
de cada uno de los parámetros.