📊 Profiling y depuracion de rendimiento

Actualizado: 2024-12-01

Antes de optimizar, medir. El profiling permite identificar exactamente donde se pierde tiempo: en queries SQL, en hooks lentos, en templates pesados o en logica de negocio costosa.

#Symfony Profiler en el BO

Activar el Symfony Profiler
bash
# ── El Symfony Profiler esta disponible en modo debug (dev) ──
# Aparece la barra negra en la parte inferior de cada pagina del BO

# Activar en config/parameters.php:
# 'kernel.debug' => true
# O en config/config.inc.php:
# define('_PS_MODE_DEV_', true);

# ── Ver el perfil de la ultima request ──
# Ir a: https://mitienda.com/admin/sf/_profiler/

# ── Informacion disponible en el Profiler ──
# - Tiempo de ejecucion total
# - Queries SQL ejecutadas (numero y duracion)
# - Memoria consumida
# - Hooks ejecutados
# - Variables Twig disponibles
# - Logs generados
# - Configuracion de Symfony

# ── Usar el profiler desde la terminal ──
php bin/console debug:container --show-private
php bin/console debug:router
php bin/console debug:event-dispatcher

#Debug de queries SQL

Activar y usar _PS_DEBUG_SQL_
php
<?php

// ── Activar debug SQL en config/config.inc.php ──
define('_PS_DEBUG_SQL_', true);

// Con _PS_DEBUG_SQL_ activo:
// - Las queries SQL lentas se muestran en el Profiler
// - Los errores SQL muestran la query completa
// - Db::getInstance()->executeS() lanza excepcion en lugar de devolver false

// ── Ver todas las queries ejecutadas en un request ──
// Despues de ejecutar queries:
$queries = Db::getInstance()->queries; // Array de queries ejecutadas (si debug activo)

// ── Imprimir el SQL de una DbQuery ──
$query = (new DbQuery())
    ->select('p.id_product, pl.name')
    ->from('product', 'p')
    ->leftJoin('product_lang', 'pl', 'p.id_product = pl.id_product')
    ->where('p.active = 1');

echo $query->build(); // Imprime el SQL generado
// SELECT p.id_product, pl.name FROM `ps_product` p
// LEFT JOIN `ps_product_lang` pl ON p.id_product = pl.id_product
// WHERE (p.active = 1)

// ── Medir tiempo de una query especifica ──
$t = microtime(true);
$r = Db::getInstance()->executeS('SELECT ...');
$t = round((microtime(true) - $t) * 1000, 2);
PrestaShopLogger::addLog('Query: ' . $t . 'ms', 1);

#Medir rendimiento en PHP

Herramientas nativas de profiling en PHP
php
<?php

// ── Medir tiempo de ejecucion de un bloque de codigo ──
class SimpleProfiler
{
    private static array $timers = [];

    public static function start(string $label): void
    {
        self::$timers[$label] = microtime(true);
    }

    public static function end(string $label): float
    {
        if (!isset(self::$timers[$label])) {
            return 0;
        }
        $elapsed = (microtime(true) - self::$timers[$label]) * 1000;
        unset(self::$timers[$label]);
        PrestaShopLogger::addLog(
            sprintf('[Profile] %s: %.2fms', $label, $elapsed),
            1, null, 'Profiler'
        );
        return $elapsed;
    }
}

// Uso:
SimpleProfiler::start('generateReport');
$report = $this->generateExpensiveReport();
$ms     = SimpleProfiler::end('generateReport');
// Log: [Profile] generateReport: 234.56ms

// ── Memoria consumida ──
echo memory_get_usage(true) / 1024 / 1024 . ' MB';
echo memory_get_peak_usage(true) / 1024 / 1024 . ' MB peak';

#Herramientas externas

HerramientaTipoUso principal
Blackfire.ioSaaS / Extension PHPProfiling detallado de CPU y memoria, call graphs
Xdebug + DDEVExtension PHP localProfiling local con cachegrind, debugging
GTmetrixSaaS onlineAnalisis de rendimiento de paginas (tiempo de carga, Core Web Vitals)
Google PageSpeedSaaS onlinePuntuacion de rendimiento y recomendaciones especificas
New RelicSaaSMonitorización en tiempo real de produccion
Query Monitor WP-No aplica directamente — usar Symfony Profiler en PS
mysqltuner.plScript MySQLAnalizar y optimizar la configuracion de MySQL

#PrestaShop Performance Panel

Configuracion optima de rendimiento en el BO
bash
# BO → Parametros Avanzados → Rendimiento
#
# ── Smarty ──
# Compilacion de templates: Nunca recompilar templates (produccion)
# Cache: Si
# Modo multi-front: Activar si hay multiples servidores
#
# ── Cache de hooks ──
# Usar cache del modulo: Si (mejora hooks con muchos modulos)
#
# ── CCC ──
# Usar CCC para CSS: Si
# Usar CCC para JavaScript: Si
# Minificar HTML: Si
# Comprimir inline JS en HTML: Si
# Mover JS al final: Si
#
# ── Servidores ──
# Servidor media: Usar un dominio diferente para los assets (CDN)
#
# ── Crypt ──
# Usar Rijndael con mcrypt: No (deprecado, usar OpenSSL)

# ── Configuracion de PHP para rendimiento ──
# opcache.enable=1
# opcache.memory_consumption=256
# opcache.max_accelerated_files=20000
# opcache.revalidate_freq=0  # En produccion
# realpath_cache_size=4096K
Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.