Magento traag?

Gebruik het cache/log/var opschoon script

Door tabellen zoals ‘log_customer’, ‘log_url’ en ‘log_url_info’ regelmatig te legen houd jij Magento snel…

Dit artikel heb ikovergenomen van www.tussendoor.nl en alle credits zijn voor ErikBenjamin.
Ik gebruik mijn blog namelijk ook om truckjes en tips vast te leggen en het onderstaande artikel is hiervan een voorbeeld.
——-
Hoewel Magento een zeer stabiel ECommerce systeem is, is de database niet zo efficiënt als het zou moeten zijn. Succesvolle E-Commerce webwinkels hebben dan ook een omvangrijke database met talloze producten of diensten. Om je Magento webwinkel snel(ler) te maken – en vooral te behouden – blijkt dat je een grote performance boost krijgt door het regelmatig opschonen van logs-bestanden. Dit helpt bij het verminderen van database queries en verbetert de prestaties aanzienlijk. Regelmatig je database opschonen houdt Magento snel, ruimt overbodige records op en zorgt bovendien voor een betere gebruikerservaring.

In dit geval waren wij voor een klant op zoek naar een manier om zijn Magento database te verkleinen. Om de klant te migreren naar een andere server was een database van 500MB niet echt een pre. Na wat onderzoek bleek dat er diverse tabellen binnen Magento zijn die gebruikt worden voor logging en zonder gevaar geleegd kunnen worden. Bijvoorbeeld de tabellen ‘log_customer’, ‘log_url’ en ‘log_url_info’ zorgen voor een enorme vervuiling. Dergelijke tabellen namen zo’n 300MB in van de in totaal 500MB. Na het runnen van onderstaand script werd de database dus direct verkleind en was de webshop direct merkbaar sneller.

Om jouw Magento installatie op te schonen hebben we onderstaand script online gezet. Het script zoekt automatisch verbinding met je Magento-database en leegt vervolgens de tabellen die je hieronder ziet staan in $tables. Het script bestaat eigenlijk uit twee delen. Je bent in staat om hiermee de ‘logs’ te verwijderen uit de database maar ook om de “var” directory te legen. Gebruik hiervoor:

  • http://www.domeinnaam.nl/cleanup.php?clean=log
  • http://www.domeinnaam.nl/cleanup.php?clean=var

Ik adviseer je een cronjob in te stellen op het script zodat je dit dagelijks of wekelijks automatisch kunt uitvoeren. Dit zorgt voor een snelle Magento versie en je voorkomt dat het systeem ‘dichtslibt’ met minder relevante data. Tevens geeft dit script je de mogelijkheid om een Magento installatie gemakkelijker te verhuizen omdat je de database aanzienlijk kunt verkleinen. Dit biedt vele voordelen op als je bijvoorbeeld gebruik maakt van phpMyAdmin. Deze wil er nog wel eens de brui aan geven bij ‘grote’ .sql-bestanden.

Script

Maak een nieuw .php-bestand aan in de root van je Magento installatie. Noem dit bestand ‘cleanup.php’ en plak onderstaande code hierin. Vervolgens hoef je alleen het bestand nog aan te roepen via de browser (of via de cronjob).

<?php
$xml = simplexml_load_file('./app/etc/local.xml', NULL, LIBXML_NOCDATA);

$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;

if($_GET['clean'] == 'log') clean_log_tables();
if($_GET['clean'] == 'var') clean_var_directory();

function clean_log_tables() {
    global $db;

    $tables = array(
        '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',
        'report_event'
    );

    mysql_connect($db['host'], $db['user'], $db['pass']) or die(mysql_error());
    mysql_select_db($db['name']) or die(mysql_error());

    foreach($tables as $v => $k) {
        mysql_query('TRUNCATE `'.$db['pref'].$k.'`') or die(mysql_error());
    }
}

function clean_var_directory() {
    $dirs = array(
        'downloader/pearlib/cache/*',
        'downloader/pearlib/download/*',
        'var/cache/',
        'var/log/',
        'var/report/',
        'var/session/',
        'var/tmp/'
    );

    foreach($dirs as $v => $k) {
        exec('rm -rf '.$k);
    }
}
?>