Preload del OPCache en PHP

Sigo profundizando en el rendimiento de WordPress y 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.


Preload del OPCache en PHP

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);
		}
	}
}


Preload del OPCache en PHP

4 comentarios en “Preload del OPCache en PHP”

  1. Excelente artículo, muy útil e importante, gracias Guti y feliz domingo mi hermano, gracias por seguir escribiendo. Saludos.

  2. supongo que cada uno tendrá que saber qué clases tiene que precargar, con lo cual estamos en lo mismo. Menuda cantidad de basura, por cierto, mira que no era mejor meterlo todo en un único archivo con todo lo necesario.

    Qué asco de WP, en serio, cada vez va a peor. Creo que cuanto más lo actualizan más morralla le meten y peor funciona, en lugar de ser al revés y quitarle cosas.

  3. Javier Gutiérrez Chamorro (Guti)

    Es complicado wordperfect. Si metemos todo en un archivo eso obligaría a cargar y procesar todo el código, aunque luego no se use. El script lo que hace es precargar todas las clases de WordPress. Efectivamente tiene el mismo problema, va a precompilar incluso aquellas que puedan no usarse.

Deja un comentario