Cómo debuggear un comando Symfony usando PhpStorm

Cómo debuggear un comando Symfony usando PhpStorm

Cómo hacer para...
En este post voy a mostrarte un caso algo particular de cómo debuggear un script que corre por línea de comandos. Se trata de debuggear un script hecho con el framework Symfony. La particularidad que tiene este escenario es que el código que escibiste (y que querés verificar), no es un archivo php común, si no que es una claseque extiende de ContainerAwareCommand, con lo cual, no es posible invocarla en forma directa. La ejecución de este comando requiere del paso por el script bin/console. Ahora, si te fijás su contenido notarás que no es más que un script php, con lo cual, podría ser debuggeado usando la configuración "estándar" de PhpStorm para estos casos... La idea en definitiva es simple, cuando ejecutás algo como: php bin/console miApp:miComando El script php que…
Leer más
Cómo debuggear un script de CLI con XDebug y PhpStorm

Cómo debuggear un script de CLI con XDebug y PhpStorm

Cómo hacer para...
Es muy común (al menos a mi me pasa muy seguido :)) encontrarse con la necesidad de escribir scripts que deberán ser ejecutados por la línea de comandos (Por ejemplo, cronjobs) dentro del contexto de una aplicación web. Hasta hace poco tenía muy claro cómo debuggear un script que ejecutaba a través del webserver, pero no había logrado (y francamente, no creía que fuera posible) debuggear un script que corría desde el CLI. Buscando un poco (y haciendo algo de prueba y error) finalmente lo logré. Si usás PhpStorm (y si no lo hacés aún, te lo recomiendo ampliamente) estos son los pasos que deberás seguir: Para empezar, asegurate de tener XDebug o ZendDebugger instalado en el entorno donde vas a correr tu script (En mi caso, usé una máquina virtual…
Leer más
Cómo subir archivos a un servidor usando php

Cómo subir archivos a un servidor usando php

Cómo hacer para...
La subida de archivos a un servidor se compone de dos partes: El envío del archivo El procesamiento una vez que se recibió La primera parte es simplemente un poco de HTML. El elemento que se utiliza para indicar que se va a querer enviar un archivo es file: <input type="file" name="archivo"> Algunos detalles importantes: El formulario que contiene una subida de archivos debe llevar un atributo que generalmente se ignora: enctype (Tipo de codificación). Además, debe indicarse el tamaño máximo del archivo a enviar (mediante un campo oculto). Ejemplo: <form enctype="multipart/form-data" action="procesarArchivo.php" method="POST"> <!-- El nombre de este campo siempre debe ser MAX_FILE_SIZE --> <input type="hidden" name="MAX_FILE_SIZE" value="30000" /> Enviar este fichero: <input name="archivo" type="file" /> <input type="submit" value="Subir" /> </form> Del lado del servidor hay algunas configuraciones que…
Leer más
Cómo autenticar usuarios en una aplicación web con PHP

Cómo autenticar usuarios en una aplicación web con PHP

Cómo hacer para...
Este es un tema que suele causar bastante confusión en la gente que se enfrenta con este problema por primera vez... hay tantos usuarios/passwords/niveles de autenticación que si no se presta mucha atención es fácil perderse. Lo principal es entender que la autenticación es un proceso de comunicación entre dos entidades: Un cliente Un servidor El cliente es el que se identifica (generalmente utilizando un par "nombre de usuario" + "contraseña") y el servidor es quien valida esas credenciales y devuelve algún tipo de identificador de acceso. Podríamos pensarlo como el guardián de una discoteca en una fiesta privada. Cualquiera puede pararse ante el grandote y decirle que es uno de los invitados, pero si tu nombre no figura en la lista... por más que patalees, te vas a quedar…
Leer más
Cómo autenticar usuarios con redes sociales en PHP

Cómo autenticar usuarios con redes sociales en PHP

Cómo hacer para...
Algo que se ha puesto bastante de moda últimamente es la posibilidad de logearse en un sitio cualquiera usando un usuario creado para otro (Por ejemplo, logearte a StackOverflow usando tu Gmail o a Clarin usando tu Facebook). Este enfoque presenta varias ventajas: Para el usuario significa no tener que inventar (¡y recordar!) una contraseña más y, por si eso fuera poco, ingresar a tu sitio haciendo un solo click. Para el sitio significa no tener que almacenar información de usuarios ni hacer un doble-opt-in (Se asume que el proveedor de autenticación ya ha validado la identidad del usuario). Ahora bien, desde el punto de vista de tu aplicación... ¿cómo podés implementar esto? La mayoría de los grandes proveedores de autenticación (Gmail, Facebook, Twitter, etc...) utilizan un protocolo que se conoce como OAuth, muy…
Leer más
Cómo autenticar usuarios vía HTTP

Cómo autenticar usuarios vía HTTP

Cómo hacer para...
La autenticación a nivel de HTTP se activa mediante la configuración del webserver. Es el nivel más bajo de autenticación que puede tenerse en un entorno web, ya que lo que va a verificar es que el cliente que solicita un determinado recurso (URI) tenga acceso a él, antes de hacer ningún otro tipo de verificación. De lo que estoy hablando es de lo que sucede cuando querés ingresar a un sitio, por ejemplo http://localhost y, en lugar de ver el contenido del sitio, se abre una ventana como esta:  Por lo general, no es mucho lo que puede validarse (No hay posibilidad de ofrecer diferentes niveles de acceso ni nada parecido), con lo cual, no es algo que suela utilizarse en entornos de acceso público. La forma de configurar este…
Leer más
Cómo almacenar archivos en una base de datos MySQL

Cómo almacenar archivos en una base de datos MySQL

Cómo hacer para...
Un clásico problema de una aplicación web es el almacenamiento de archivos subidos por los usuarios (Sus fotos por ejemplo). Si bien teóricamente se puede realizar sin mayores inconvenientes (Al fin y al cabo, un archivo digital no es más que una colección de datos binarios), es sumamente ineficiente hacerlo (Como vimos en el curso sobre Programación web con Bases de datos). Veamos cómo sería esto: Primero que nada, habría que manejar de alguna forma el upload de archivos, pero, asumiendo que el archivo ya está disponible para php se podría pensar en almacenarlo dentro de la base de datos utilizando algún campo tipo BLOB. Un problema inmediato que surge de tomar esta opción es que la base de datos crecerá mucho si el sistema es muy utilizado, lo cual…
Leer más
¿Es conveniente montar tu propio servidor web?

¿Es conveniente montar tu propio servidor web?

Reflexiones
Lo primero que tenés que contestar antes de pensar en esto es si vas a ser capaz de darle soporte (Qué pasa si se cae el Apache en la mitad de la noche por ejemplo). Después está el tema de qué le vas a instalar. ¿Sos un fanático del composer? ¿Necesitás Memcached? ¿APC? ¿Cronjobs? ¿Qué tanto tráfico vas a tener? ¿Te bancás a tus vecinos? Como de costumbre, no existe una respuesta única y universal. Cada alternativa tiene sus ventajas y desventajas. Ventajas de usar un servidor compartido Costo (El abono suele ser más económico, aunque algunas VPS como DigitalOcean tienen planes super interesantes) Soporte técnico incluido (Como siempre, no todos los proveedores te van a dar el mismo nivel de soporte, pero siempre vas a tener algún tipo de soporte…
Leer más
Un sistema de caché distribuido en PHP

Un sistema de caché distribuido en PHP

Ejemplos
Hace un tiempo, cuando trabajaba para una gran .com del rubro turismo, surgió un escenario muy interesante que teníamos que resolver junto con mi equipo: Teníamos un servidor de bases de datos que daba soporte a siete servidores que hacían de FrontEnd. Nuestra aplicación era php puro (con un "framework" desarrollado in-house... muy mala idea) y todos los frontends corrían el mismo código (Todo detrás de un balanceador de carga, obvio): El problema que teníamos era que el sitio tenía bastante tráfico y la base de datos se nos convertía en un cuello de botella bastante a menudo. La solución que implementamos consistía en tener ciertas partes de las respuestas pre-calculadas. Ahora, como te imaginarás, mantener una experiencia de navegación consistente teniendo varios servidores diferentes tiene sus complicaciones, en nuestro…
Leer más
Cómo ejecutar stored procedures de MySQL usando PHP

Cómo ejecutar stored procedures de MySQL usando PHP

Cómo hacer para...
Un procedimiento almacenado es una herramienta que permite almacenar código ejecutable directamente en la base de datos. Personalmente no lo considero una práctica muy recomendable por varias razones: La idea de tener lógica de negocio fuera del código de mi aplicación me da cierta desconfianza (No me gusta no poder entender todo lo que está pasando en mi aplicación sólo con ver su código). Llegado el caso de tener que migrar de motor de base de datos el tener procedimientos almacenados puede convertirse en un problema Aún así, entiendo que puede haber situaciones en las que sea conveniente recurrir a ellos... especialmente cuando se trata de operaciones suamente complejas/pesadas o que tienen que ver estrictamente con el mantenimiento de la base de datos. ¿Cómo se llaman desde PHP? http://php.net/manual/es/mysqli.quickstart.stored-procedures.php http://www.mysqltutorial.org/php-calling-mysql-stored-procedures/
Leer más