Rendimiento de PHP: cómo perfilar y acelerar el código 10 veces

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Tu sitio PHP va lento? Es hora de mirar bajo el capó

\n\n

¿Alguna vez has esperado a que cargue una página más tiempo del que tardas en tomarte tu café matutino? Un dolor familiar. PHP es un lenguaje potente, pero sin la configuración adecuada puede convertirse en una tortuga. En este artículo no daremos aburridas conferencias. Tomaremos código real, lo perfilaremos, encontraremos los cuellos de botella y lo aceleraremos tanto que el servidor te lo agradecerá.

\n\n

Hablaremos sobre el rendimiento de PHP, desde mediciones simples hasta un perfilado profundo. Aprenderás cómo usar Xdebug y Blackfire para encontrar las secciones problemáticas, y qué métodos de optimización realmente funcionan. ¡Allá vamos!

\n\n

Paso 1. Midamos todo: de microsegundos a megabytes

\n\n

Antes de optimizar algo, debemos entender dónde está el cuello de botella. La intuición a menudo falla. Usemos herramientas.

\n\n

La forma más simple: microtime(true)

\n\n

Para una comprobación rápida de un fragmento de código, sirve el clásico microtime(). No es elegante, pero funciona.

\n\n
<?php\n$start = microtime(true);\n\n// Tu código lento\n$data = [];\nfor ($i = 0; $i < 100000; $i++) {\n    $data[] = md5($i . 'salt');\n}\n\n$end = microtime(true);\necho 'Tiempo de ejecución: ' . round(($end - $start) * 1000, 2) . ' ms';\n?>
\n\n

Este método es bueno para una estimación aproximada. Pero cuando el proyecto crece, se necesitan herramientas serias.

\n\n

Xdebug — tu detective personal

\n\n

Xdebug es el estándar de facto para el perfilado de PHP. Genera archivos cachegrind que se pueden abrir en KCachegrind (Linux) o QCachegrind (Mac/Windows).

\n\n

Instalación mediante pecl:

\n
pecl install xdebug
\n\n

Habilitamos el perfilado en php.ini:

\n
xdebug.mode = profile\nxdebug.output_dir = /tmp/profiling
\n\n

Después de ejecutar el script, aparecerá un archivo en la carpeta. Ábrelo en QCachegrind: verás qué función consumió más tiempo. A menudo la sorpresa: no es la base de datos, sino un simple procesamiento de cadenas en un bucle.

\n\n

Blackfire — para los que aman los paneles bonitos

\n\n

Blackfire de SensioLabs (los creadores de Symfony) es un perfilador en la nube. Muestra no solo el tiempo, sino también el número de llamadas, la memoria y la E/S. Se integra con PHPUnit, Symfony y Laravel.

\n\n

Ejemplo de uso desde la línea de comandos:

\n
blackfire run php myscript.php
\n\n

Obtendrás un enlace a un informe web con visualización. Es útil para encontrar cuellos de botella de rendimiento en PHP.

\n\n

Paso 2. Problemas típicos y sus soluciones

\n\n

Ahora que sabemos perfilar, analicemos los problemas comunes.

\n\n

Problema 1: Consultas N+1 en un bucle

\n\n

Un clásico. Obtienes una lista de usuarios y luego, en un bucle, haces una consulta a la BD para cada uno.

\n\n

Código lento:

\n
<?php\n$users = $db->query('SELECT id FROM users LIMIT 100');\nforeach ($users as $user) {\n    $orders = $db->query("SELECT * FROM orders WHERE user_id = {$user['id']}");\n    // ...\n}\n?>
\n\n

Optimización:

\n
<?php\n$users = $db->query('SELECT id FROM users LIMIT 100');\n$ids = array_column($users, 'id');\n$orders = $db->query('SELECT * FROM orders WHERE user_id IN (' . implode(',', $ids) . ')');\n// Agrupamos por user_id\n$grouped = [];\nforeach ($orders as $order) {\n    $grouped[$order['user_id']][] = $order;\n}\n?>
\n\n

Resultado: 100 consultas se convirtieron en 2. El rendimiento de la aplicación PHP aumenta varias veces.

\n\n

Problema 2: Bucles ineficientes y trabajo con cadenas

\n\n

La concatenación de cadenas en un bucle es mala. Usa arrays y implode().

\n\n
<?php\n// Malo\n$result = '';\nfor ($i = 0; $i < 10000; $i++) {\n    $result .= 'item' . $i . ',';\n}\n\n// Bueno\n$parts = [];\nfor ($i =                

Blogs

Book Recommendations