Software

Script para el mantenimiento de Magento: logs y cache

Uno de los problemas que más quebraderos de cabeza tienen los webmaster de sitios Magento, suele residir en la gestión que hace el mismo de su directorio ./var/, y de la falta de mecanismos para el pruning de tablas con logs, que puede llegar a tener un tamaño considerable, lo cual puede ser un problema también a la hora de realizar backup (mysqldump) de MySQL. Es hora sde hacer un mantenimiento de Magento (prunning)

Tareas cron para mantenimiento de Magento

Script para el mantenimiento de logs y cache de Magento

Una versión modificada del script que encontramos en Internet, Magento Log & Cache Maintenance Script, nos servirá para adaptarlo a nuestras necesidades. La modificación fue realizada, ya que el script original usa un sistema bastante inseguro, usando una llamada curl, a un fichero PHP, mediante una URL .

Podríamos poner este fichero en un directorio, protegido por .htaccess pero usar contraseñas en tareas cronjobs, es una merma de seguridad y una mala práctica. Así que usaremos el script en una ubicación no accesible vía web, y en su lugar usaremos php para ejecutarlo con parámetros.


 * @copyright  Copyright (c) 2006-2013 Crucial Web Hosting, Ltd.
 * @link       http://www.crucialwebhost.com  Crucial Web Hosting
 *
 * Modificaciones por Castris DOT COM, S.L.
 * @author     Castris dot com, S.L. abdelkarim [arroba] castris.com   
 */  
switch($argv[1]) {
    case 'log':
 clean_log_tables();
    case 'var':
 clean_var_directory();
    case 'log_smtp':
 clean_log_smtp();
    break;
}
function clean_log_smtp() {
    $xml = simplexml_load_file('//app/etc/local.xml', NULL, LIBXML_NOCDATA);
    if(is_object($xml)) {
        $db['host'] = $xml->global->resources->default_setup->connection->host;
        $db['name'] = $xml->global->resources->default_setup->connection->dbname;
        $db['user'] = $xml->global->resources->default_setup->connection->username;
        $db['pass'] = $xml->global->resources->default_setup->connection->password;
        $db['pref'] = $xml->global->resources->db->table_prefix;
        $tables = array(
            'smtppro_email_log'
        );
        mysql_connect($db['host'], $db['user'], $db['pass']) or die(mysql_error());
        mysql_select_db($db['name']) or die(mysql_error());
        foreach($tables as $table) {
            @mysql_query('TRUNCATE `'.$db['pref'].$table.'`');
        }
    } else {
        exit('Unable to load local.xml file');
    }
}
function clean_log_tables() {
    $xml = simplexml_load_file('//app/etc/local.xml', NULL, LIBXML_NOCDATA);
    if(is_object($xml)) {
        $db['host'] = $xml->global->resources->default_setup->connection->host;
        $db['name'] = $xml->global->resources->default_setup->connection->dbname;
        $db['user'] = $xml->global->resources->default_setup->connection->username;
        $db['pass'] = $xml->global->resources->default_setup->connection->password;
        $db['pref'] = $xml->global->resources->db->table_prefix;
        $tables = array(
            'aw_core_logger',
            'dataflow_batch_export',
            'dataflow_batch_import',
            'log_customer',
            'log_quote',
            'log_summary',
            'log_summary_type',
            'log_url',
            'log_url_info',
            'log_visitor',
            'log_visitor_info',
            'log_visitor_online',
            'index_event',
            'report_event',
            'report_viewed_product_index',
            'report_compared_product_index',
            'catalog_compare_item',
            'catalogindex_aggregation',
            'catalogindex_aggregation_tag',
            'catalogindex_aggregation_to_tag'
        );
 mysql_connect($db['host'], $db['user'], $db['pass']) or die(mysql_error());
        mysql_select_db($db['name']) or die(mysql_error());
        foreach($tables as $table) {
            @mysql_query('TRUNCATE `'.$db['pref'].$table.'`');
        }
    } else {
 exit('Unable to load local.xml file');
    }
}
function clean_var_directory() {
    $dirs = array(
        'downloader/.cache/',
        'downloader/pearlib/cache/*',
        'downloader/pearlib/download/*',
        'media/css/',
        'media/css_secure/',
        'media/import/',
        'media/js/',
        'var/cache/',
        'var/locks/',
        'var/log/',
        'var/report/',
        'var/session/',
        'var/tmp/',
        'var/ait_rewrite/'
    );
    foreach($dirs as $dir) {
        exec('rm -rf '.$dir);
    }
}

Guardamos el fichero en el directorio donde mantenemos nuestros scripts para ejecutar con las tareas cron (cronjobs).

Directorio Cron
Es una buena práctica de seguridad, para nuestro servidor VPS o nuestro alojamiento web, mantener un directorio donde guardar nuestros script, ya sea para su ejecución manual o mediante tareas cron, fuera de los directorios accesibles desde un navegador.

Creamos una tarea cron desde el shell si nuestro proveedor de hosting nos lo permite, o en su defecto accedemos a nuestro panel de control, para añadir una tarea cron.

El comando a añadir sería uno de estos, o tantas lineas como tareas distintas necesitemos.

sleep ${RANDOM:0:3} php -q //cleanup.php var > /dev/null 2>&1
sleep ${RANDOM:0:3} php -q //cleanup.php log > /dev/null 2>&1
sleep ${RANDOM:0:3} php -q //cleanup.php log_smtp > /dev/null 2>&1
  • var realiza una limpieza de los ficheros contenidos en la función (editable) clean_var_directory()
  • log realiza una limpieza de las tablas contenidas en la función (editable) clean_log_tables()
  • smtp_log es una limpieza contenida en la función añadida como ejemplo, clean_log_smtp()

Un ejemplo de linea completa escrita en el shell sería:

@weekly sleep ${RANDOM:0:2}m; php -q /home/usuario/cron/cleanup.php var > /dev/null 2>&1

Las posibilidades de edición con Cpanel serían menores.

Opinion
Yo personalmente uso RANDOM cuando uso las tareas con lo que se llama tareas predefinidas de cronjob ya que de esta manera se evita el solapamiento o sobrecarga de operaciones que usan estas predefinidas.

Artículos Relacionados


Imagen original desde Freepik diseñada por harryarts y retocada por Abdelkarim Mateos

Comparte este artículo

Artículo Antiguo
Este artículo tiene más de 2 años. Es muy probable que su contenido este anticuado, aunque pueda ser de utilidad, es conveniente que revises otras informaciones al respecto. Si lo encuentras útil o crees que puede ser actualizado, deja tu comentario con la actualización para poder editarlo y que pueda ser útil a los demás.

Comparte este articulo en

Abkrim

Yo solo se que no se nada, y que me paso la vida aprendiendo

Entradas recientes

Fatal error: Allowed memory size of 268435456 bytes exhausted en WordPress. Otro post más… pero diferente

No es la primera vez que me encuentro con el agotamiento de la memoria en…

5 meses hace

Problemas de Acceso con Centos 7, Almalinux 8, Ubuntu 20.04, y Debian 10/11: Un Enigma Firewall CSF

Descubre cómo solucionar problemas de acceso a servidores con Centos 7, Almalinux 8, Ubuntu 20.04…

9 meses hace

MySQL no inicia debido a errores en la base de datos interna de MySQL

Uno de los mensajes más alarmantes que puedes encontrarte es aquel que indica que tu…

11 meses hace

Actualización de seguridad 6.2.1 para WordPress y la importancia de los backups confiables

La seguridad de nuestro sitio web es de vital importancia en el mundo digital actual.…

12 meses hace

El mito de los ficheros SVG inseguros en las subidas de ficheros

Los ficheros SVG son archivos gráficos vectoriales escalables ampliamente utilizados en diseño web. Aunque no…

12 meses hace

Solución de problemas de errores 500 en Castris Hosting: una guía para usuarios de cPanel

En este artículo, te guiamos en la solución de problemas de errores 500 en Castris…

12 meses hace