¿Cómo reducir el consumo de memoria de algunos plugins de WordPress?

Uno de los problemas derivados del uso de plugins en WordPress es el consumo de memoria, el cual es proporcional al número de plugins activos o más específicamente al número de líneas de código que el interprete de PHP tiene que cargar y ejecutar en cada petición.

Una forma para lidiar con este problema en determinados plugins es separar la definición de éstos (añadir filtros, acciones, etc) del código que implementa su funcionalidad, de este modo podemos cargar el código sólo si se cumplen ciertas condiciones.

Como ejemplo, voy a tomar el popular Google XML Sitemaps que con sólo activarlo aumenta unos 600 KB el consumo de memoria anterior y dada las características de este plugin, solamente debería ejecutarse cuando se genera o modifica contenido. Este proceso es relativamente sencillo:

  • Crear un nuevo archivo en el mismo directorio del plugin anterior. Para el ejemplo lo llamaremos sitemap_plugin.php.
  • Ubicar y mover los metadatos (nombre y datos del autor) del plugin al nuevo archivo. Para el ejemplo movemos las líneas 30 a 37 de sitemap.php:
    php:
    <?php
    /*
     Plugin Name: Google XML Sitemaps
     Plugin URI: http://www.arnebrachhold.de/redir/sitemap-home/
     Description: This plugin will generate a sitemaps.org compatible sitemap of your WordPress blog which is supported by Ask.com, Google, MSN Search and YAHOO. <a href="options-general.php?page=sitemap.php">Configuration Page</a>
     Version: 3.0
     Author: Arne Brachhold
     Author URI: http://www.arnebrachhold.de/
     */

    ?>
  • A continuación se debe indentificar y mover la parde donde se "registran" los filtros y acciones (add_filter, add_action, etc.) que hacen que el plugin sea invocado. Para el ejemplo, esta parte se encuentra en las líneas 3652 a 3656 de sitemap.php, lugar donde se invoca al método Enable de la clase GoogleSitemapGenerator:
    php:
    <?php
    /*
     Plugin Name: Google XML Sitemaps
     Plugin URI: http://www.arnebrachhold.de/redir/sitemap-home/
     Description: This plugin will generate a sitemaps.org compatible sitemap of your WordPress blog which is supported by Ask.com, Google, MSN Search and YAHOO. <a href="options-general.php?page=sitemap.php">Configuration Page</a>
     Version: 3.0
     Author: Arne Brachhold
     Author URI: http://www.arnebrachhold.de/
     */


    if(defined('ABSPATH') && defined('WPINC')) {   
            if ( is_admin() || defined('XMLRPC_REQUEST') && constant('XMLRPC_REQUEST') && !empty($HTTP_RAW_POST_DATA) ) {
                    require_once(dirname(__FILE__) . '/sitemap.php');
                    add_action("init", array("GoogleSitemapGenerator","Enable"), 1000,0);
            }
    }
    ?>

    La condición de la línea 12 sirve para filtrar el tipo de peticiones que llegan al blog, en otras palabras el plugin sólo se cargará si entramos a la parte de administración* o se hace una petición a través de XMLRPC.

  • Desactivar y volver a activar el plugin una vez hecho los cambios.

Con este simple cambio hecho sobre el plugin Google XML Sitemaps se reduce el consumo de memoria para la mayoría de peticiones que se realizan sobre un blog, sin embargo, sacrificando un poco de funcionalidad todavía se puede optimizar un poco más usando WP-Cron.

*: En realidad el método is_admin() sólo verifica que la URL contenga wp-admin/, no necesariamente significa que estamos en el panel de administración.

WordPress 2.3: privacidad, problemas y otros

A estas alturas supongo que seré uno de los últimos de los que aburra con este tema 😀 , pero la salida de WordPress 2.3 ha generado -- como esperaba luego de leer la lista de correo -- bastante polémica por que el nuevo sistema de actualizaciones envía ciertos datos* a api.wordpress.org.

Privacidad

A pesar de que el código para la notificación de actualizaciones está en el repositorio desde el 22 de agosto, este incidente empezó día anterior al lanzamiento de esta versión con opiniones divididas -- incluso entre los desarrolladores -- sobre si es necesario y sobre todo, si es correcto o no que éstos datos se envíen sin el consentimiento de los usuarios. Lo malo de todo este revuelo que se armó es que hasta dos horas antes del lanzamiento, ninguno de los que reclamaba que quitaran esta característica propuso un parche; por otro lado también hubo respuestas inadecuadas por parte de Matt Mullenweg, en especial esta:

If you don’t trust wordpress.org, I suggest you do one of the following:

  • Use different software.
  • Fork WordPress.
  • Install one of the aforementioned plugins.

Problemas

Esta versión trae consigo importantes cambios en el esquema de la base de datos, por lo que es necesario antes de actualizar, asegurarse que los plugins y tema usados sean compatibles.

Andrés recopiló una serie de errores que muchos usuarios parecen compartir, adicionalmente a esto si alguien se encuentra con el siguiente error no tiene porque preocuparse (probablemente es parte de un bug antiguo que permitía agregar dos veces la misma categoría a una entrada).

code:
WordPress database error: [Duplicate entry 'post_id-category_id' for key 1]
INSERT INTO wp_term_relationships (object_id, term_taxonomy_id)
VALUES ('post_id', 'category_id')

Personalmente les sugiero que primero hagan pruebas locales antes de actualizar sus blogs, pueden seguir el artículo "5 Step Failsafe upgrade for WordPress" para esto, pero sólo tomen en cuenta los últimos cuatro pasos (por ningún motivo realicen el paso 1 con la alternativa que se menciona ahí, o al menos no lo mantengan activado luego de terminar de actualizar).

Consumo de memoria

Me ha llamado la atención otra vez los datos que publica Andrés con respecto al incremento de memoria de WordPress 2.3, según sus pruebas esta última versión consume casi el doble de memoria que la anterior versión:

code:
//Wordpress 2.2
Memoria usada: 2981.4 KB de 3328 KB

//Wordress 2.3
Memoria usada: 6743.2 KB de 6912 KB

Personalmente creo que hay algo raro en su entorno de pruebas 🙂 , puesto que tanto en DreamHost, en este servidor y la máquina virtual que uso, WordPress 2.2 recién instalado y con el tema por omisión consume alrededor de 4530 KB y WordPress 2.3 está por los 5180 KB, con lo cual el incremento de memoria no es tan dramático para blogs pequeños como éste (blogs más populares tampoco tienen porque preocuparse si usan wp-cache).

Una forma de reducir un poco más el consumo de memoria de blogs que usan archivos de traducción, es traducir sólo el texto necesario (fechas principalmente) y eliminar las demás palabras, pueden descargar estos archivos que actualmente uso para el blog:

Continue reading "WordPress 2.3: privacidad, problemas y otros"