📊 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
| Herramienta | Tipo | Uso principal |
|---|---|---|
| Blackfire.io | SaaS / Extension PHP | Profiling detallado de CPU y memoria, call graphs |
| Xdebug + DDEV | Extension PHP local | Profiling local con cachegrind, debugging |
| GTmetrix | SaaS online | Analisis de rendimiento de paginas (tiempo de carga, Core Web Vitals) |
| Google PageSpeed | SaaS online | Puntuacion de rendimiento y recomendaciones especificas |
| New Relic | SaaS | Monitorización en tiempo real de produccion |
| Query Monitor WP | - | No aplica directamente — usar Symfony Profiler en PS |
| mysqltuner.pl | Script MySQL | Analizar 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.