Qué es un CDN y por qué deberías usarlo

Qué es un CDN y por qué deberías usarlo

CDN significa Content Delivery Network o Red de Distribución de Contenidos. Se trata de conjuntos (por lo general bastante grandes) de servidores sincronizados entre sí y preparados para servir contenido estático desde diversos puntos del planeta. Su objetivo principal es el de disminuir el tiempo de carga de una página web (Algo que siempre viene bien). Este objetivo se logra combinando varios factores. Entre ellos: Aprovechando el paralelismo de los pedidos HTTP: Al tener el contenido distribuido en diversos servidores (en lugar de tener el código php y los archivos estáticos en el mismo) el cliente puede lanzar varias peticiones en paralelo por un lado y, por el otro, el pobre servidor al que llegan todos los visitantes de tu sitio puede delegar parte de la carga, lo cual a…
Read More

Cuál es el modo más seguro de almacenar passwords en PHP

Es bastante común últimamente recibir noticias de que algún sitio de gran popularidad ha sido hackeado (O, como suele comunicarse, "su seguridad se ha visto comprometida"). Dependiendo del tipo de sitio del que se trate el problema puede preocuparnos más o menos. Pero eso es cuando somos meramente usuarios del sitio... ¿qué pasa cuándo se trata de un sitio que está bajo nuestra responsabilidad? Aclaremos algo antes de seguir: es imposible hacer un sitio 100% libre de vulnerabilidades. Si hay gente decidida (y capaz) a romper nuestra seguridad lo van a lograr. Es por eso que es muy importante, no sólo poner trabas a los atacantes si no también dejar un botín poco atractivo para el caso de que lo consigan. Algo bastante común es que la gente reutilice sus contraseñas…
Read More
¿SQL vs. NoSQL?

¿SQL vs. NoSQL?

Se escucha mucho últimamente que SQL pasó de moda, que hoy lo cool es usar NoSQL (MongoDB, CouchDB, etc...) pero... ¿es siempre así? Empecemos por entender qué es una base de datos NoSQL (formalmente no estoy muy convencido de que un almacenamiento que no respete las reglas ACID pueda llamarse base de datos, pero bueno... como para no entrar en más de una discusión a la vez, digamos que sí). De lo que estamos hablando es de un medio de almacenamiento no estructurado, comúnmente conocido como base de datos documental. Más allá de las formalidades (los registros de la base de datos relacional se llaman documentos en una base NoSQL, las tablas pasan a ser colecciones, etc..), existen diferencias muy concretas: Los documentos no tienen estructura (Pueden guardar literalmente cualquier cosa) No existen…
Read More
Cómo usar CC y BCC con PHPMailer

Cómo usar CC y BCC con PHPMailer

[caption id="attachment_834" align="aligncenter" width="1592"] Mailbox with enveloppes isolated on white.[/caption] PHPMailer es una librería que permite enviar emails desde PHP (Podés consultar algunas opciones acá). Su uso es bastante simple: basta con crear una instancia de PHPMailer para tener acceso a una gran cantidad de funcionalidad: <?php use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require_once 'vendor/autoload.php'; $mail = new PHPMailer(); $mail->isSMTP(); $mail->Host = 'mail.google.com'; $mail->SMTPAuth = true; $mail->Username = 'usuario@gmail.com'; $mail->Password = 'miSuperPassword'; $mail->SMTPSecure = 'tls'; $mail->Port = 587; $mail->setFrom('acedmy@leewayweb.com', 'Leeway Academy'); $mail->addAddress('juan.perez@yahoo.com', 'Juan Perez'); $mail->Subject = 'Este es el asunto'; $mail->Body = 'Este el cuerpo del mensaje'; if(!$mail->send()) { echo 'No se pudo enviar el mensaje...'.$mail->ErrorInfo; } else { echo 'El mensaje se envió!'; } Para agregar otros destinatarios en copia (CC) o copia oculta (BCC), simplemente debemos agregar estas líneas: $mail->addCC('copiado@hotmail.com');…
Read More
Cómo definir la configuración de la sesión en Symfony

Cómo definir la configuración de la sesión en Symfony

Ante todo, una aclaración: PHP maneja las sesiones a través de cookies (Antiguamente también se podía propagar el ID de sesión vía URL, aunque es una práctica muy poco segura y, sinceramente, hace mucho que no lo veo). Bien, ahora... ¿qué cosas podrías querer cambiar de la configuración de la sesión? Varias. El nombre de la cookie El tiempo de duración El lugar donde se almacena la información del lado del servidor Sobre la segunda y la tercera, acá tenés un ejemplo de por qué querrías hacerlo :) Respecto de la primera, más que nada se trata de un tema de seguridad. Fijate esta captura de pantalla de la consola del navegador: El nombre PHPSESSID es el nombre por defecto que se le asigna a la cookie de sesión de una…
Read More
Cómo enviar mails con formato usando SwiftMailer

Cómo enviar mails con formato usando SwiftMailer

Ya he comentado en otros artículos sobre las diferentes posibilidades para enviar emails usando PHP. De todas las que he probado hasta el momento, SwiftMailer es la que me resulta más cómoda y conveniente, sin embargo, he tenido algunas peleas a la hora de enviar mails con formato (es decir, mails que contengan HTML que necesito que sea entendido como tal y no como mero texto). La verdad es que es bastante simple lograrlo, sólo hay que conocer el método adecuado :) En general, lo que uno hace cuando quiere enviar un email es algo como esto: $message = (new Swift_Message()) ->setSubject('Este es el asunto') ->setFrom(['mauro.chojrin@leewayweb.com' => 'Mauro Chojrin']) ->setTo(['destinatario@dominio.com' => 'Gran Amigo']) ->setBody('Este es el importante mensaje que quiero enviarte!!') ; El problema (si puede llamársele así) es que…
Read More
Cómo definir relaciones Cero-a-Uno con Doctrine

Cómo definir relaciones Cero-a-Uno con Doctrine

En general cuando uno comienza a estudiar Bases de Datos Relacionales se habla de un tipo de relación Uno-a-Uno que, en la práctica se usa muy poco. Sin embargo las relaciones tipo Cero-a-Uno tienen muchísimo sentido. Es el caso de que se quiera modelar un sistema donde una entidad es un caso especial de otra (Algo similar al concepto de herencia de POO), como por ejemplo la relación entre personas y actores: Todos los actores son personas No todas las personas son actores La forma de implementar esto en una base de datos relacional es poner un campo tipo clave foránea en la tabla hija, el cual a su vez tendrá un índice único (Para reforzar la cardinalidad de la relación). En el caso del ORM Doctrine, todo esto parte de la…
Read More
Cómo usar el intérprete de PHP de una VM desde PhpStorm

Cómo usar el intérprete de PHP de una VM desde PhpStorm

Una práctica muy buena a la hora de programar (y ahorrarse dolores de cabeza) es el uso de máquinas virtuales. Muchos desarrolladores usan este esquema, sin embargo, también es bastante común que tengan sus propias versiones del software usado para ejecutar sus aplicaciones instalado en su máquina física (por ejemplo PHP). Si estás trabajando en varios proyectos a la vez, los cuales están deployados en servidores diversos, es muy probable que en cada VM tengas instalada una versión diferente de PHP (La misma que tenés en el servidor de producción), con lo cual, al menos una VM debe tener instalada una versión diferente de PHP que la que tenés instalada en tu máquina. Como usás una VM no deberías tener mayores dificultades a la hora de deployar, pero a la hora…
Read More
Cómo debuggear una aplicación PHP sin usar var_dump

Cómo debuggear una aplicación PHP sin usar var_dump

Una de las tareas que más tiempo consume durante el desarrollo de una aplicación (web o no) es el debugging. Ese momento en que estás seguro de que todo anda bien, pero por las dudas... hay que probarlo. Y, como siempre, algo no sale exactamente como esperabas. Es entonces cuando te toca arremangarte, buscar una nueva taza de café, silenciar el teléfono y hurgar. El modo común de encarar esta tarea en el universo php es usar mucho la función var_dump (Algo bastante feo de lo que hablo en más detalle en mi libro). Asumiré que ya sabés de qué se trata xdebug, que ya está instalado y configurado en tu entorno y que estás familiarizado (un poco al menos) con PhpStorm. Desde dentro del IDE podés lanzar tu aplicación usando el botón…
Read More

Cómo funciona el conversor de parámetros de Symfony

Cada vez que conozco más del framework Symfony, más me gusta :). Esto que te voy a mostrar a continuación me pareció un acto de magia cuando me lo crucé por primera vez: el conversor de parámetros. En la mayoría de los Controllers (especialmente cuando se trata de CRUDs), se recibirá algún parámetro que será la clave para encontrar el objeto sobre el que se quiere realizar la operación, por ejemplo: public function showAction(Request $request) { $client = $this->getDoctrine()->getRepository('AppBundle:Client')->find($request->getParameter('id'); if ( $client ) { ... } else { // 404 } } Es muy común ver código de este tipo. De hecho, si lo miramos desde un poco lejos notaremos que hay una estructura en común en estas operaciones: Buscar el objeto Si se encontró, procesar normalmente Si no se…
Read More