Introducción: La era de las conjeturas ha terminado
\n\n¿Recuerdan la clásica discusión en el equipo: «¿Y si hacemos el botón rojo? ¡No, el azul convierte mejor!». La discusión terminaba con el grito del desarrollador más seguro o con la decisión del «jefe», que a menudo resultaba equivocada. En 2024, este enfoque es un lujo inaceptable.
\n\nLas pruebas A/B en aplicaciones PHP no son solo un término de moda. Es un método científico que permite tomar decisiones basadas en datos, no en la intuición. Usted lanza dos versiones de una página (A — control, B — variante), las muestra a diferentes segmentos de usuarios y observa qué versión cumple mejor con la acción objetivo (compra, suscripción, clic).
\n\nEn este artículo, analizaremos cómo implementar pruebas A/B en PHP sin dolor, con ejemplos reales de código y bibliotecas listas. Aprenderá cómo calcular correctamente la significancia estadística y no caer en la trampa del «falso positivo».
\n\n¿Por qué PHP es ideal para pruebas divididas?
\n\nPHP es un lenguaje del lado del servidor. Esta es su superpotencia en el contexto de las pruebas divididas. A diferencia de las soluciones basadas en JavaScript (Google Optimize, VWO), las pruebas A/B del lado del servidor:
\n\n- \n
- No dependen de la carga de scripts. El usuario no ve «parpadeos» del sitio al cambiar de variante. \n
- Funcionan sin JS. Ideales para SEO y usuarios con JavaScript desactivado. \n
- Permiten probar la lógica. Puede cambiar no solo el CSS, sino también algoritmos, precios, condiciones de envío directamente en el código. \n
- Son más seguras. El código del experimento está oculto a miradas indiscretas. \n
La principal desventaja es la complejidad de escalar. Si tiene 10,000 experimentos simultáneamente, la lógica del servidor puede volverse pesada. Pero para el 99% de los proyectos, las soluciones en PHP son más que suficientes.
\n\nArquitectura de una prueba A/B simple en PHP
\n\nAntes de escribir código, definamos los principios básicos. Cualquier prueba A/B en PHP consta de tres etapas:
\n\n- \n
- Segmentación — división del tráfico (generalmente 50/50 o 80/20). \n
- Visualización de la variante — renderizado de la versión correcta de la página. \n
- Recopilación y análisis — registro de eventos y cálculo de estadísticas. \n
Paso 1: Segmentación simple (Bucket Test)
\n\nLa forma más confiable es distribuir a los usuarios entre variantes basándose en su ID o sesión. Nunca use un número aleatorio para cada solicitud: el usuario saltaría entre variantes.
\n\n<?php\n// Forma simple: dividir al usuario por mod de su ID\nfunction getTestVariant(int $userId, string $testName, int $splitPercent = 50): string {\n // Crear un hash estable\n $hash = crc32($testName . '_' . $userId);\n $bucket = abs($hash) % 100;\n\n if ($bucket < $splitPercent) {\n return 'A'; // Control\n } else {\n return 'B'; // Variante\n }\n}\n\n// Uso\n$userId = 12345;\n$variant = getTestVariant($userId, 'button_color_test', 50);\n\nif ($variant === 'A') {\n echo '<button class="btn-blue">Comprar</button>';\n} else {\n echo '<button class="btn-red">Comprar</button>';\n}\n?>\n\nEste código garantiza que el mismo usuario siempre verá la misma versión. La optimización de conversión de sitios web en PHP comienza precisamente con una lógica tan simple.
\n\nPaso 2: Registro de eventos
\n\nSin datos, la prueba es inútil. Debe registrar dos tipos de eventos: impresión (impression) y conversión (goal).
\n\n<?php\n// Registro de impresión\nfunction logImpression(int $userId, string $testName, string $variant): void {\n $pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');\n $stmt = $pdo->prepare('INSERT INTO ab_tests (user_id, test_name, variant, even