Un redimensionador de imágenes eficiente hecho con PHP

Un redimensionador de imágenes eficiente hecho con PHP

Ejemplos
Un proyecto interesante que tuve la oportunidad de realizar hace unos años fue un sistema de procesamiento de imágenes. El desafío era lograr un servicio simple que permitiera escalar y rotar imágenes velozmente. Lo diseñé como un componente separado de la aplicación principal (Una red social de viajes) para poder instalarlo sin inconvenientes en un servidor diferente (y eventualmente poder vincularlo a otros proyectos). Por entonces me pareció una buena idea montarlo sobre una arquitectura RESTFul y, como era un proyecto muy simple y acotado (y tenía ganas de aprender algo nuevo de paso) decidí usar un framework especialmente diseñado para estos efectos: Tonic. Lo más importante como siempre: ¿qué nombre ponerle a una aplicación como esta? Mucho de fotografía no sé, pero buscando un poco me pareció que Bresson podía…
Leer más

Cómo consumir un WebService REST con PHP

Cómo hacer para...
Un poco de background como para asegurarnos de que hablamos de lo mismo Qué es un webservice Un webservice (o servicio web) es una forma de integrar aplicaciones web. Básicamente se trata de un servidor que expone parte de su funcionalidad para que sus clientes (que generalmente son otros servidores de diferentes aplicaciones) puedan utilizarlas. Las principales ventajas de usar web services son: La posibilidad de valernos de la capacidad instalada (¡y mantenida!) por terceros La facilidad para extender la funcionalidad de nuestra aplicación (Basta con realizar las llamadas al servicio web que deseamos) La principal desventaja de usar este enfoque es que dependemos de servicios de terceros que, salvo en casos muy puntuales, no podemos controlar. Ejemplos de webservices: Autenticación de usuarios vía Facebook, Google, Twitter, etc... Generación de…
Leer más

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

Buenas prácticas
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…
Leer más
Cómo usar CC y BCC con PHPMailer

Cómo usar CC y BCC con PHPMailer

Cómo hacer para...
[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');…
Leer más
Cómo enviar mails con formato usando SwiftMailer

Cómo enviar mails con formato usando SwiftMailer

Cómo hacer para...
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…
Leer más
Cómo logear errores con PHP

Cómo logear errores con PHP

Cómo hacer para...
Es una realidad conocida por todos los programadores el hecho de que, por más esfuerzo que pongamos, los usuarios se las arreglan para encontrar errores antes que nosotros :). No sólo eso, lo más probable es que, al reportar un error (o intentar hacerlo), no tengan mucho más para decirnos que "No hice nada y el sistema se colgó"... evidentemente, no es un panorama muy alentador como punto de partida para encontrar (e implementar) una solución, ¿cierto? Es ahí donde tener un buen log de errores puede hacer la diferencia entre perder el relax del fin de semana o dejar a superman opacado en los ojos del cliente. Veamos entonces algunas técnicas para contar con esa información cuando se la necesita (y sí... tarde o temprano la vas a necesitar). La…
Leer más
¿Una clase abstracta siempre tiene que tener un método abstracto?

¿Una clase abstracta siempre tiene que tener un método abstracto?

Misceláneos
Respuesta corta: NO (Al menos en PHP). ¿Querés los detalles? Seguí leyendo... Esta pregunta surgió en una clase de POO y me pareció interesante compartir la respuesta ya que no es realmente trivial. El ejemplo que estábamos viendo era el siguiente: Teníamos un sistema que manejaba clientes, con lo cual, contaba con una clase Cliente: class Cliente { private $nombre; private $apellido; private $cuit; private $email; public function __construct( $nombre, $apellido, $cuit, $email ) { $this->setNombre($nombre); ... } public function setNombre( $nombre ) { $this->nombre = $nombre; } ... } Pronto vimos la necesidad de especializar esta clase en tres subclases diferentes: class PYME extends Cliente { } class PersonaFisica extends Cliente { } class Multinacional extends Cliente { } Dado que los requerimientos del sistema quedaron más claros y era…
Leer más
Cómo alterar la configuración de PHP sin acceder al php.ini

Cómo alterar la configuración de PHP sin acceder al php.ini

Cómo hacer para...
Existen situaciones en las que necesitamos modificar ciertos parámetros de la configuración de PHP (Por ejemplo, la cantidad de memoria permitida para un script o el tiempo máximo de ejecución) para que cierto código funcione correctamente. Desafortunadamente, no siempre podemos hacerlo del modo normal, es decir, modificando el archivo php.ini. Es más, existen casos en los que no querremos que estos cambios tengan efecto en scripts diferentes del que estamos desarrollando. El típico caso en que esto sucede es un entorno de hosting compartido. Algunos proveedores dan acceso a una versión particular del archivo por cada sitio que alojan, aunque la mayoría no lo permiten en absoluto (Es lógico si se piensa un poco, un servidor en el que corren muchas aplicaciones debe hacer un gran esfuerzo por evitar que un…
Leer más
Cómo consumir un WebService SOAP con PHP

Cómo consumir un WebService SOAP con PHP

Cómo hacer para...
Los WebServices son un mecanismo muy útil para integrar aplicaciones a través del protocolo HTTP. Una de las formas en que se implementan estos mecanismos es a través de SOAP. Consumirlos usando PHP es bastante simple, para ello se utiliza la clase SOAPClient. Veamos un ejemplo de cómo consultar la localización física según la IP: <?php $url = "http://ws.cdyne.com/ip2geo/ip2geo.asmx?wsdl"; try { $client = new SoapClient($url, [ "trace" => 1 ] ); $result = $client->ResolveIP( [ "ipAddress" => $argv[1], "licenseKey" => "0" ] ); print_r($result); } catch ( SoapFault $e ) { echo $e->getMessage(); } echo PHP_EOL; En este caso, este script debería ser corrido desde CLI (Por ejemplo, si lo guardás como "ws.php", al ejecutar php ws.php 210.45.151.101 obtendrás la salida: stdClass Object ( [ResolveIPResult] => stdClass Object ( [City] => Huainan…
Leer más
Cómo prevenir los ataques por SQL Injection en aplicaciones PHP

Cómo prevenir los ataques por SQL Injection en aplicaciones PHP

Cómo hacer para...
Uno de los fantasmas más temidos por quienes contratan servicios de desarrollo (especialmente cuando se trata de su primera experiencia) es el de los ataques de hackers. Si bien es imposible asegurar al 100% un sistema (de software o de cualquier otro tipo), existe una serie de buenas prácticas que disminuyen sensiblemente la probabilidad de ocurrencia de tales ataques (o al menos, su probabilidad de éxito). Por lo general, los ataques se basan en la explotación de código vulnerable como ser algún caso raro que el desarrollador no tuvo en cuenta. Uno de los ataques más usuales es el conocido como sql injection. De lo que se trata es de ejecutar código sql sin autorización. Los scripts de PHP que no están bien escritos pueden ser atacados de esta forma. Veamos un ejemplo: <?php $sql…
Leer más