Sigo profundizando en el rendimiento de WordPressy también de tu web. En esta ocasión hablaré de las mejoras en cuando al Zend Opcache que si bien se introdujeron en PHP 7.4, no han empezado a despertar el interés hasta el lanzamiento de PHP 8.
Opcache (php_opcache) es una vieja extensión introducida en PHP 5.5, aunque estaba disponible de manera separada desde el 5.3 creo recordar. Su misión es esencialmente cachear el código parseado/compilado de PHP en memoria. Ya sabéis que tanto si usamos JIT como si no, cada vez que se carga una página el motor de PHP lee de disco sus archivos, lo interpreta, carga sus include/require y finalmente la ejecuta. Ese proceso es lento y por eso Opcache suele producir bastantes beneficios.
El inconveniente de Opcache es que para cada instancia que se lanza de PHP, ya sea esta vía CGI como FastCGI se debe regenerar el contenido de ese caché, lo cual lleva tiempo. Eso es lo que viene a solucionar el preload o preloading que mencionaba. La directiva preload le indica a Opcache qué archivo PHP debe ejecutar al cargarse. Para ello modificamos nuestro php.ini o el archivo de configuración de PHP que usemos para que contenga lo siguiente:
opcache.preload = "/home/htdocs/www/_opcache.preload.php"
Efectivamente /home/htdocs/www/_opcache.preload.php es la ruta física (del sistema de archivos del sistema) que contiene el archivo con los contenidos a precargar. Este ejemplo lo que indica son las clases de WordPress necesarias y que he obtenido de internet aplicándole algunas mejoras:
declare(strict_types=1);
$wp_dir = dirname(__FILE__) . '/';
$preload_patterns =
[
$wp_dir . 'wp-includes/Text/Diff/Renderer.php',
$wp_dir . 'wp-includes/Text/Diff/Renderer/inline.php',
$wp_dir . 'wp-includes/SimplePie/**/*.php',
$wp_dir . 'wp-includes/SimplePie/*.php',
$wp_dir . 'wp-includes/Requests/**/*.php',
$wp_dir . 'wp-includes/Requests/*.php',
$wp_dir . 'wp-includes/**/class-*.php',
$wp_dir . 'wp-includes/class-*.php',
];
$exclusions =
[
$wp_dir . 'wp-includes/class-simplepie.php',
$wp_dir . 'wp-includes/SimplePie/File.php',
$wp_dir . 'wp-includes/SimplePie/Core.php',
$wp_dir . 'wp-includes/class-wp-simplepie-file.php',
$wp_dir . 'wp-includes/class-snoopy.php',
$wp_dir . 'wp-includes/class-json.php',
];
foreach ($preload_patterns as $pattern)
{
$files = glob($pattern);
foreach ($files as $file)
{
if (!in_array($file, $exclusions, true))
{
opcache_compile_file($file);
}
}
}