Principales errores de desarrolladores PHP principiantes: nivel avanzado

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

Principales errores de desarrolladores PHP principiantes: nivel avanzado



Cuando pasas de scripts simples a aplicaciones web complejas en PHP, la cantidad de trampas aumenta drásticamente. Muchos desarrolladores, después de dominar la sintaxis básica, cometen errores sistémicos que provocan fugas de memoria, vulnerabilidades y caídas de rendimiento. En este artículo, analizaremos 4 errores avanzados que suelen cometer los desarrolladores de nivel intermedio y mostraremos cómo solucionarlos.



1. Gestión incorrecta de sesiones y fugas de memoria



Uno de los errores más engañosos es el manejo incorrecto de las sesiones. Muchos desarrolladores almacenan grandes volúmenes de datos en las sesiones (por ejemplo, resultados de consultas a la base de datos u objetos serializados). Esto no solo ralentiza el trabajo, sino que también puede provocar fugas de memoria en el servidor.



Problema: La sesión se bloquea durante la ejecución del script. Si almacenas 10 MB de datos en ella, cada solicitud leerá y escribirá ese volumen, y con solicitudes paralelas, se pondrán en cola.



Ejemplo de código incorrecto:

<?phpsession_start();// Cargamos en la sesión un array de 10000 registros$_SESSION['big_data'] = $db->query("SELECT * FROM logs")->fetchAll();?>


Solución: Usa las sesiones solo para identificación (user_id, token). Todos los demás datos almacénalos en caché (Redis, Memcached) o en la base de datos.



<?phpsession_start();$_SESSION['user_id'] = $user->id;// Los datos se obtienen bajo demanda$cache = new RedisCache();$data = $cache->get('user_data_' . $user->id);if (!$data) {    $data = $db->query("SELECT * FROM logs WHERE user_id = ?", [$user->id])->fetchAll();    $cache->set('user_data_' . $user->id, $data, 3600);}?>


2. Almacenamiento en caché incorrecto e ignorar la invalidación



El segundo error más común es el almacenamiento en caché "para siempre". Los desarrolladores establecen un tiempo de vida (TTL) de 24 horas o más, y luego se sorprenden de que los usuarios vean datos obsoletos. Peor aún es el almacenamiento en caché sin tener en cuenta los cambios en la base de datos.



Problema: Si almacenas en caché una lista de productos durante 1 hora y un administrador cambia el precio, los usuarios verán el precio anterior durante otros 60 minutos.



Ejemplo de código incorrecto:

<?php$cacheKey = 'product_list';$products = $cache->get($cacheKey);if (!$products) {    $products = $db->query("SELECT * FROM products")->fetchAll();    $cache->set($cacheKey, $products, 86400); // 24 horas}?>


Solución: Usa etiquetado de caché o invalidación forzada al modificar los datos.



<?php// Al actualizar un productofunction updateProduct($id, $data) {    $db->update("products", $data, ["id" => $id]);    // Invalidamos el caché    $cache->delete('product_list');    $cache->delete('product_' . $id);}

// Al leer$products = $cache->remember('product_list', 3600, function() use ($db) { return $db->query("SELECT * FROM products WHERE active = 1")->fetchAll();});?>


3. Inyecciones SQL a través de funciones "seguras"



Muchos desarrolladores creen que si usan mysqli_real_escape_string() o addslashes(), están protegidos contra inyecciones SQL. Esta es una peligrosa idea errónea. Estas funciones no protegen contra todos los tipos de ataques, especialmente al trabajar con LIKE, ORDER BY y LIMIT.



Problema: La función mysqli_real_escape_string() no escapa los caracteres para el operador LIKE (por ejemplo, % y _). Si introduces la entrada del usuario en LIKE, un atacante puede acceder a datos que no debería ver.



Ejemplo de vulnerabilidad:

<?php$search = $_GET['q'];$safe = mysqli_real_escape_string($conn, $search);$query = "SEL                

Blogs

Book Recommendations