944 063 154

Blog

Etiqueta: PHP

PHP 7.2: mejoras en las funciones y aumento de la seguridad

Publicado en Desarrollo web en febrero 14, 2018 10:00 am

Es de sobra conocido que PHP es uno de los lenguajes de programación más utilizado para el desarrollo de todo tipo de aplicaciones, de ahí que se encuentre en actualización continua para adaptarse a las nuevas tecnologías y necesidades.  En las últimas semanas, han lanzado su última versión: PHP 7.2.

La nueva versión de PHP incluye diversas funciones y mejoras que te ayudarán a escribir código y a que se ejecute de una forma más rápida. Todo ello permite que se reduzcan los recursos necesarios para el desarrollo y mantenimiento de las aplicaciones. Asimismo, PHP 7.2 contribuye a aumentar la seguridad mediante librerías que no requieren de API externa.

Las mejoras de PHP 7.2

Entre las principales mejoras de este lenguaje backend se encuentra el cambio en la declaración del tipo de argumento. Esto ya estaba disponible en PHP 5, y mejoró en PHP 7.0, pero en la última versión ha sufrido ligeras modificaciones. Con PHP 7.2 es posible declarar “object” como tipo de argumento o retorno en funciones.

PHP no permite variaciones en los tipos de parámetros de métodos heredados. Pero con la llegada de PHP 7.2 sí es posible omitir un tipo en una subclase (“type widening”) sin que se produzca un error de concordancia. De esta forma sería posible implementar tipos en los argumentos de librerías sin tener que modificar clases en otras librerías o aplicaciones que dependan de las mismas.

Por último, se añade la posibilidad de incluir coma final al utilizar la construcción “list()”.

Mayor seguridad

La última versión de PHP también incluye cambios en relación con la seguridad. El primero de ellos es la incorporación de Libsodium al núcleo. Libsodium es una librería multiplataforma y moderna para criptografía. Permite cifrar, descifrar, firmar y crear hashes. Por otro lado, PHP 7.2 incorpora soporte nativo para Argon2, un algoritmo de hashing, como alternativa a Bcrypt.

Funciones obsoletas

Aunque acaban de presentar la versión 7.2, desde PHP ya se comienza a hablar de algunos cambios que tendrá PHP 8.0. Todos ellos relacionados con funciones que se eliminarán y que ya recomiendan no utilizar.

  • function __autoload. Esta función fue reemplazada por por spl_autoload_register en PHP 5.1.
  • $php_errormsg. Con PHP 7.2 es recomendable utilizar error_get_last y error_clear_last en su lugar.
  • create_function(). Por diversos problemas de seguridad y debido a su bajo rendimiento, se recomienda utilizar “closures”.
  • parse_str () sin segundo parámetro. PHP comenzará a advertir cada vez que se use la función sin pasar por el segundo parámetro.
  • gmp_random(). En lugar de utilizar esta función deberá usarse gmp_random_bits() y gmp_random_rage().
  • assert(). Su resultado abre una vulnerabilidad de ejecución remota de código (RCE). Por ello, se recomiendael uso de zend.assertion ini.
  • Tampoco se recomienda el uso de mbstring.func_overload, (unset) cast, each() y $errcontext. Estas funciones han sido declaradas como obsoletas por resultar poco útiles.

Si PHP es uno de los lenguajes de programación más utilizados es, en parte, por su relación con WordPress, ya que el CMS está desarrollado con PHP. Pero, lamentablemente, la mayoría de usuarios de WordPress no acostumbra a actualizar su versión de PHP. De ahí que más de un 70% de las webs aún usen PHP 5.6 o incluso versiones más antiguas. Esto, además de ser un peligro de cara a la seguridad, puede ocasionar problemas de rendimiento.

Desde Linube recomendamos la actualización, al menos, a PHP 7. De esta forma, tu web irá mucho más rápida y será capaz de ejecutar un mayor número de transacciones por segundo que en cualquier versión anterior.

Por nuestra parte, ya contamos con PHP 7.2 en todos nuestros servicios.

Lenguajes de programación con los que iniciarse en 2018

Publicado en Desarrollo web en diciembre 20, 2017 10:03 am

Si acabas de aterrizar en el mundo de la informática es posible que sólo con ver la variedad de lenguajes de programación que existen te estés empezando a arrepentir de tu decisión. Es cierto que existen múltiples lenguajes de programación y que cada uno de ellos requiere un aprendizaje prácticamente exclusivo. Pero una vez dentro, verás que manejar líneas de código no es tan difícil como parece. Se acerca el nuevo año y sabemos que aprender programación puede ser uno de los propósitos para 2018. Por ello, hemos seleccionado algunos de los mejores lenguajes de programación.

Code Studio

Es el lenguaje de programación desarrollado por code.org. La asociación sin ánimo de lucro que intenta visibilizar la importancia de aprender programación desde edades tempranas y que se convierta en una asignatura más en los colegios. Aunque esté especialmente orientado para niños, puede ser una buena opción si jamás has trabajado con lenguajes de programación. El objetivo de Code Studio no es enseñar un lenguaje de programación como tal, si no proporcionar las bases para iniciarse en otros lenguajes más complejos.

Code Studio con su sencilla interfaz permite crear juegos y aplicaciones mediante combinaciones de bloques. La forma en que se ordenen los elementos provocará una determinada acción. Además, puede integrarse con HTML5, de forma que el resultado pueda estar disponible a través de casi cualquier navegador y pueda compartirse a través de las redes sociales.

Python

Sí, el nombre de este lenguaje de programación viene por la admiración de su creador, Guido van Rossum, por el grupo de humoristas británico Monty Python. Lanzado en 1991, este lenguaje de programación de código abierto apuesta por una sintaxis que pueda leerse con facilidad.

Con Python los resultados empiezan a verse de forma casi inmediata. De ahí que sea uno de los lenguajes de programación con la curva de aprendizaje más rápida. Además, permite probar fragmentos de código incluso antes de integrarlo. Algo que puede resultar de gran utilidad tanto a quien ya tiene conocimientos de programación como a los recién iniciados. Esto es así ya que Python permite corregir algunos errores antes de que la página web esté en activo.

Java

Posiblemente el lenguaje de programación con más teorías acerca del origen de su nombre. Java fue creado a principios de los 90 para el desarrollo de aplicaciones receptoras de televisión. Su sintaxis está muy relacionada con C++, aunque Java únicamente se orienta a objetos, salvo alguna que otra excepción, y clases.

Java es uno de los lenguajes con mayor crecimiento. En gran medida por ser compatible con casi todos los dispositivos; desde smartphones, a navegadores web, servidores o incluso aplicaciones de escritorio. A diferencia de los que algunos creen, Java apenas guarda relación alguna con JavaScript. No tienen mayor relación más allá del nombre y el uso de una sintaxis a la que también recurren muchos otros lenguajes de programación.

PHP

PHP es uno de los lenguajes de programación más utilizado tanto para el desarrollo web como en el funcionamiento de servidores actualmente. Pese a sus más de dos décadas de vida siguen incorporándose nuevas funciones. Las últimas en la versión 7.1 centradas en la reducción de consumo de recursos y mejorar el rendimiento de una página web o un servidor.

Algunas de las webs más famosas han sido desarrolladas con PHP, como Facebook o WordPress. Por lo que si tienes una página web que has desarrollado a partir de este CMS, tienes parte del trabajo hecho; además del mejor entorno para realizar pruebas. Eso sí, no te olvides de hacer una copia de seguridad antes de modificar nada. No vaya a ser que luego el experimento acabe saliéndote muy caro.

Nosotros te damos ideas, elegir por qué lenguaje de programación te decantas es ya cosa tuya.

PHP 7.1 presenta 5 nuevas funcionalidades

Publicado en Desarrollo web en marzo 7, 2017 10:56 am

Creado en 1995, PHP es la principal alternativa para a la hora de desarrollar páginas web con grandes demandas de tráfico. También es buena opción para la configuración de cualquier tipo de proyecto web o servidor. PHP se ha convertido en uno de los lenguajes de programación más utilizado por los desarrolladores web gracias a su simplicidad y compatibilidad con la gran mayoría de sistemas operativos y servidores. Este año, se ha presentado PHP 7.1 con varias mejoras.

Las funcionalidades de PHP no han dejado de incrementarse y perfeccionarse, tanto que, recientemente, se ha presentado la versión 7.1. Con PHP 7.1, llegan algunas mejoras que permitirán reducir el consumo de recursos y proporcionarán un mejor rendimiento web que en anteriores versiones.

Principales cambios de PHP 7.1

  1. Adiós a mcrypt. A partir de ahora, los desarrolladores tendrán que recurrir a OpenSSL ya que con PHP 7.1 desaparece la biblioteca mcrypt. De esta forma, se pone fin a las múltiples incompatibilidades y errores que generaba en las versiones anteriores.
  2. Parámetros ‘nullable’. Si PHP 7.0 permitía declarar los tipos, con PHP 7.1 también es posible indicarlos. Podremos indicar si éste es nulo y que sea considerado como un argumento o que pueda ser devuelto como un valor y no un error, como ocurría hasta el momento.
  3. Función ‘void’. A partir de ahora, es posible indicar que una función tiene un retorno de tipo void, especificando que dicha función no devolverá ningún tipo de valor.
  4. Constantes de clase visibles. PHP 7.1 incluye el soporte que permite la definición del nivel de visibilidad de las constantes de clase. Ahora, podrán ser privadas, protegidas o públicas, única opción de visibilidad hasta PHP 7.0.
  5. Multicaptura de excepciones. Esta funcionalidad permite capturar múltiples excepciones de jerarquías diferentes y gestionarlas como una sola sin tener que recurrir al copia-pega en del código. Así, el resultado será un código mucho más limpio.

Qué más incluye PHP 7.1

La última actualización de PHP incluye también mejoras que permiten la desestructuración de un array asimétrico, la introducción de un nuevo seudotipo denominado iterable o el soporte necesario para especificar claves en list e índices negativos de cadenas.

Si quieres conocer el resto de novedades de PHP 7.1, puedes consultar el documento oficial colgado en su página web. En él, se detallan todas las funcionalidades y se adjuntan ejemplos en código de cada una de ellas.

En Linube ya contamos con la nueva versión

Aprovechamos para informar que en Linube ya disponemos de la versión 7.1 de PHP en todos nuestros servidores cloud. El uso de PHP 7.1 no implica que PHP 5 deje de funcionar, si bien recomendamos la actualización y adaptación del código para beneficiarse de las nuevas funcionalidades que ofrece PHP 7.1.

Configurar wildcard domains conservando la variable de $_SESSION en php

Publicado en Administración de Sistemas en mayo 10, 2010 8:43 am

Muchos os habréis fijado en servicios web que usan subdominios dinámicos (wildcard) para las cuentas de sus usuarios. Sin embargo, una vez configurados los subdominios dinámicos, tenemos un serio problema y es que, las variables de sesión por defecto se pierden cada vez que ejecutamos la aplicación web desde un subdominio distinto al que hemos utilizado para crear dicha variable de sesión. Es por ello que debemos configurar wildcard domains.

Podemos comprobar esto en algunos sitios web que no usan subdominios dinámicos pero, si hacemos login en su www.dirección.com, si después vamos a su dirección.com sin las ‘www’ nos encontramos con que no hemos iniciado sesión. El problema es similar y tiene la misma solución que en el caso de los wildcard domains.

Configurar Wildcard Domains

Vamos a explicar cómo solucionar este problema y cómo hacer funcionar subdominios dinámicos. Los pasos:

1 – Configurar el dns.
2 – Configurar el servidor web.
3 – Configurar bien el ámbito de las variables $_SESSION en la aplicación php para que se compartan las variables de sesión entre los subdominios.

Configurar el dns.

Basta con crear una entrada tipo host es decir, “A” apuntando a *.tudominio.com . También vale con crear un CNAME * apuntando al registro A del dominio principal (“tudominio.com”).

Si hacemos un ping a “loquesea.tudomino.com” debería ya resolver (a menos que tengas capado el tráfico ICMP claro).

Configurar el servidor web.

Apache httpd: debemos configurar en el vhost de nuestro dominio un ServerAlias que atienda a “*.midominio.com”.

Nginx: hay que configurar en la sección Server un valor server_name como “*.midominio.com”.

IIS: debemos dejar un sitio virtual sin headers y ese es el que atenderá las peticiones de vuestro wildcard dns, es la única forma.

Se ha discutido sobre este tema en el foro oficial de IIS y según los propios desarrolladores, aunque ha sido demandada durante años, no se piensa implementar dicha funcionalidad por ahora, ni siquiera en IIS7.

Nota: sólo podemos disponer de un sitio web sin headers por servidor web IIS.

Configurar nuestras variables de $_SESSION en php

El truco esta en configurar la directiva session.cookie_domain como “.midominio.com” (importante el . delante del dominio).

Podéis hacerlo en tiempo de ejecución, antes de llamar a session_start(); siempre que tengamos deshabilitado el autoarranque de sesiones en el php.ini (como es lógico y viene por defecto)

ini_set("session.cookie_domain",".midominio.com");
session_start();

 

¿Usas plesk?

Aquí te explicamos cómo configurar wildcard domains en servidores con el panel de control Plesk.

Trabajando con windows azure y php: primer deploy

Publicado en Desarrollo web Servidores Cloud Sistemas TI en abril 1, 2010 8:15 pm

Una de las primeras dudas que nos entran a la hora de pensar en Azure es si Azure es algún tipo de instancia virtual, a la que podemos acceder vía escritorio remoto y configurar lo que necesitemos en nuestro servidor.

Azure es un concepto distinto a esto, un planteamiento o paradigma nuevo a la hora de pensar en el alojamiento de nuestras aplicaciones web en internet. Exige en un principio estar abiertos a un cambio, un cambio necesario que se impondrá sin ninguna duda en los próximos años.

Azure es un entorno formado por varios roles a los que subiremos según el tipo de rol de nuestra instancia, nuestra aplicación, nuestra base de datos, nuestros archivos estáticos y nuestros procesos backend. Todo está pensado para ser modular y escalable sin provocar dolores de cabeza al desarrollador. Estos roles se comunicarán entre sí mediante Rest vía Http o sockets TCP/IP. El coste será por horas de servicio y, aunque las instancias estén paradas se seguirán cobrando.

En Windows Azure principalmente tenemos los siguientes roles:

  • Web Role: Destinado a servir aplicaciones web frontales, escritas en .net, php, ruby, perl, python o cualquier lenguaje que soporte Fastcgi.
  • Worker Role: Destinado a servicios que funcionen en el backend, los primeros que se nos vienen a la mente pueden ser mysql o memcached.

Adicionalmente tenemos estos otros servicios en Azure:

  • SqlAzure: Una versión de Sql Server 2008 implementada en Azure.
  • Storage: Un repositorio de archivos con el que podremos trabajar desde nuestras aplicaciones web.

En este primer acercamiento me voy a centrar en el WebRole y por la naturaleza de nuestra aplicación web, será de tipo FastCgi para poder ejecutar aplicaciones php.

Para programar en php bajo entorno Microsoft uso Visual Studio 2008 + vs.php o netbeans (en este caso usaré lo primero). Si no usas visual studio, dispones de herramientas que te permiten trabajar de una forma similar pero utilizando Eclipse. Recuerda que si estás en la universidad o has terminado hace poco, existen descargas gratuitas completas de visual studio y horas de servicio Azure en dreamspark.

Lo primero es crear un servicio tipo Windos Azure en el panel de control de la plataforma azure.

azure1

Una vez creado el servicio vemos que disponemos de dos entornos, uno de integración y otro de producción. Nos cobrarán por tener instancias en ambos entornos, estén levantadas o no.

azure2

Para poder trabajar con Azure desde visual studio, nos tenemos que descargar el SP1 y las Windows Azure Tools for Microsoft Visual Studio que nos permitirán disponer de un entorno basado en IIS similar a azure.

Una vez hecho esto, en Visual Studio podremos seleccionar un tipo de proyecto Windows Azure Cloud Service.

azure3

Tras seleccionar el tipo de proyecto, nos preguntará qué rol vamos a asignar a este proyecto. En nuestro caso al ser una aplicación php, le asignamos el rol WebCGI role.

azure4

Una vez completado este paso, se nos crearán dos proyectos en el árbol de soluciones de Visual Studio y se nos mostrará el contenido del archivos de configuración del WebRole: el Web.roleconfig. Este es un archivo xml tipo al Web.config y en el que aparece entre las llaves fast cgi el siguiente comentario:


<!-- Set the "Enable Full Trust" property to true on the corresponding
 Web Role in the Cloud Service project.
 -->

 <!-- Define the fastCgi application here. The application must be located
 under the role root folder or subfolder. The handler is defined in
 the Web.config file.

 Ensure that all of the handler binaries have their "Build Action" Solution
 Explorer file property set to "Content".

 <application fullPath="%RoleRoot%approotcgi-handler.exe" arguments="arg1 arg2 ..." />
 -->

Nos pide que realicemos las siguientes tareas:

  • Que subamos la aplicación fastCGI encargada de procesar las peticiones a nuestra aplicación. Los binarios de la aplicación deben estar en el directorio raíz de nuestro proyecto (representado por la constante %RoleRoot%approot) y debemos configurar el handler en el web.config de la aplicación.
  • Tenemos que activar la propiedad “Full Trust” en la configuración del WebRole.

Vamos a ello:

1) Primero nos descargamos los binarios o instalamos el msi (te recomiendo lo segundo) la última versión de php en windows.php.net

2) Una vez descargado o instalado php, copiamos sus binarios tal cual al directorio raíz de nuestro proyecto (a un directorio llamado /php). Si has instalado php, normalmente te dejará los binarios en “c:archivos de programaphp”.

3) Si ya tenemos el directorio php en nuestra raíz del proyecto, indicaremos donde se encontrará la aplicación en el Web.roleconfig


<?xml version="1.0"?>

<configuration>
 <system.webServer>
   <fastCgi>
     <application fullPath="%RoleRoot%approotphpphp-cgi.exe" arguments="" />
   </fastCgi>
 </system.webServer>
</configuration>

4) En el web.config descomentamos las líneas dedicadas al Handler FastCgi y las dejamos como siguen:


<add name="FastGGI Handler"
 verb="*"
 path="*.php"
 scriptProcessor="%RoleRoot%approotphpphp-cgi.exe"
 modules="FastCgiModule"
 resourceType="Unspecified" />

5) En las propiedades del Rol WebCgi nos aseguramos que está activada la propiedad Full Trust de .net

azure5

6) Subimos nuestra aplicación php. En este caso, subiré una sencilla aplicación que hará una tirada basándose en el bastante poco óptimo sistema aleatorio de php para otorgarme puntos en diferentes niveles de ataque y defensa.

Después de hacerlo, escribirá el resultado en un archivo de texto pero estará disponible tan sólo de forma temporal. Si quisiéramos almacenarlo de forma persistente, deberíamos almacenarlo en Azure Storage.

El código es el siguiente:


<?php
$poderes = array(
 "resistencia al fuego",
 "resistencia al frio",
 "aguante",
 "formulas de excel",
 "mirada penetrante",
 "escalabilidad",
 "ROI",
 "SEO",
 "SEM",
 "SMO",
 "pensamiento deslumbrante");

$resultado = null;

for($i=1;$i<10;$i++){

 $puntos     = $i*1E2*rand(5,11);
 $poder      = $poderes[rand(0,10)];
 $resultado .= $puntos . " puntos en " . $poder;
 $resultado .= "n";

 echo "Asier ha obtenido " . $puntos . " puntos en " . $poder . "<br/>";

}

$fp = fopen("resultados.txt","w+");
fwrite($fp, $resultado, strlen($resultado));
fclose($fp);

7) Si estamos ejecutando Visual Studio como Administrador podemos compilar el proyecto, sino lo cerramos y ejecutamos Visual Studio con privilegios de Administrador. Una vez compilada la aplicación se nos abrirá nuestro navegador ejecutando nuestra aplicación php.
Por defecto, si no le indicamos un archivo raíz, nos dará un error que nos detalla que no tenemos permiso para listar el directorio raíz.
Para que nos cargue un archivo inicial, podemos agregarle la clave defaultDocument a la configuración system.webServer en el web.config.

<system.webServer>
 <defaultDocument enabled="true">
   <files>
     <add value="index.php"/>
   </files>
 </defaultDocument>

8) Vale en principio tenemos todo funcionando en local, ya que vemos que se ejecuta la aplicación y que escribe las puntuaciones en el archivo de texto.
Ahora necesitamos subir todo esto a Azure.

Si volvemos al panel de control de windows.azure.com, y pulsamos en el botón deploy en el entorno de integración vemos que se nos pide subir dos archivos: El paquete de la aplicación y el archivo de configuraciones.

azure6

Desde Visual Studio podemos generar muy fácilmente estos dos archivos al hacer click en la opción Publicar, que aparece al hacer click en el botón derecho sobre el proyecto de Azure.

Cuando lo hagamos, se nos abrirá la ventana en el navegador del Panel de control de Azure y una ventana en el explorador de windows con la ruta donde se han generado los archivos.

Una vez subidos le damos a Run, e iniciará la instancia. Tarda varios minutos.

Tras la espera podemos ejecutar nuestra aplicación desde la ruta que nos indique el panel de control.

azure8

Hay otras herramientas de las que podemos beneficiarnos al crear aplicaciones en Azure, una de ellas es el gran módulo de rewrite de IIS7 con el que podemos utilizar urls amigables en nuestras aplicaciones web.

Vamos a hacer que nuestra aplicación otorgue le de poderes a un usuario que le indiquemos por url.

Para ello tenemos que añadir una regla de rewrite en el web.config, dentro de system.webserver, en la que le indiquemos por la ruta /user/[nick] se le pasará como parámetro GET al script index.php.


<rewrite>
  <rules>
    <rule name="Rewrite">
       <match url="^user/([a-z]+)" />
      <action type="Rewrite" url="index.php?user={R:1}" />
    </rule>
  </rules>
</rewrite>

En la aplicación recuperamos el parámetro GET. Tendríamos el siguiente código en el index.php


<?php
$poderes = array(
  "resistencia al fuego",
  "resistencia al frio",
  "aguante",
  "formulas de excel",
  "mirada penetrante",
  "escalabilidad",
  "ROI",
  "SEO",
  "SEM",
  "SMO",
"pensamiento deslumbrante");

$resultado = null;

$usuario = "asier";
if(!empty($_GET) && is_array($_GET) && key_exist("user", $_GET)){
  $usuario = ucfirst($_GET["user"]);
}

for($i=1;$i<10;$i++){

  $puntos     = $i*1E2*rand(5,11);
  $poder      = $poderes[rand(0,10)];
  $resultado .= $puntos . " puntos en " . $poder;
  $resultado .= "n";

  echo $usuario . " ha obtenido " . $puntos . " puntos en " . $poder . "<br/>";

}

$fp = fopen("resultados.txt","w+");
fwrite($fp, $resultado, strlen($resultado));
fclose($fp);

Una función que me resulta imprescindible también es poder visualizar los logs de nuestra instancia y podemos hacerlo desde el panel de control de Azure y una cuenta de storage.

Con esto hemos visto como ejecutar aplicaciones web sencillas php en Azure, en las próximas entregas veremos como usar los Worker Roles, SQL Azure y cómo trabajar con phpazure para almacenar y recuperar archivos en Azure Storage.

Cosas que he echado en falta

Entre las cosas que he echado en falta, y desconozco por ahora si Azure es las permite de forma nativa o con herramientas de terceros pueden ser las siguientes:

  • Un módo más ágil para hacer deploy de nuestras aplicaciones. Los desarrolladores web php estamos acostumbrados a usar subversion o rsync para hacer deploy de nuestras aplicaciones. El hecho de tener que generar un paquete y luego subirlo, es un paso que estaría genial si se automatizase. Lo más lógico podría ser que desde la opción publicar de visual studio se subiesen los cambios al entorno de integración de azure o al menos, a Azure Storage para que luego se haga el deploy definitivo con un botón desde el panel de control web de azure.
  • Posibilidad de personalizar el directorio público a la que se tendrá acceso desde el servidor web. En algunos frameworks como Symfony, el directorio público no es el directorio raíz de la aplicación por seguridad.
  • Algún modo para gestionar los permisos de los directorios de la aplicación. No es para nada seguro tener permisos de escritura en todos los directorios de nuestra aplicación.
  • Posibilidad de ejecutar scripts php o powershell vía cmd en la instancia. Imaginemos que necesitamos vaciar un directorio en el que almacenamos archivos de caché o archivos temporales, podemos hacerlo mediante algún script que se ejecute vía web, pero igual puede interesarnos realizar estas gestiones o alguna otra mediante línea de comandos.

Script para ayudarte a migrar de php5.2 a php5.3

Publicado en Desarrollo web en enero 25, 2010 9:33 pm

Como en la nueva versión de php algunas de las funciones más usadas de php se consideran deprecated y se han añadido nuevas funcionalidadesStanislav Malyshev se ha hecho un script que nos avisa de posibles incompatibilidades en nuestro código.

Dicho script es una utilidad de línea de comandos que puede buscar código problemático en un archivo php o en un directorio.

El script lo podéis descargar de github en este enlace.

Mejoras de PHP 5.3 que todo programador debería conocer

Publicado en Desarrollo web en enero 18, 2010 1:40 am

¿Eres programador php? Entonces deberías actualizarte a la versión php5.3 y aprovecharte de sus mejoras. Con PHP 5.3, el mismo código en php5.3 se ejecuta un 50% más rápido que un código escrito en php5.2. Unido a la mejora del rendimiento unido a la mejora en cuanto seguridad es lo que debería motivar a cualquier desarrollador php a actualizarse a la nueva versión. Además pueden surgir problemas en el código escrito en versiones anteriores.

Entre los cambios más importantes que podemos encontrarnos, están los siguientes:

1. Las short tags de php están obsoletas

Ahora usar <? o <?=$variable dará error tipo DEPRECATED e interrumpirá la ejecución de la aplicación web.

Esto era recomendable desde hace varios años para evitar conflictos en documentos xml, que empiezan con dichas tags.


//el siguiente código dará error
&amp;amp;amp;lt;? echo "hola"; ?&amp;amp;amp;gt;
&amp;amp;amp;lt;?=$di_hola ?&amp;amp;amp;gt;

//el código correcto es el siguiente
&amp;amp;amp;lt;?php echo "hola"; ?&amp;amp;amp;gt;
&amp;amp;amp;lt;?php echo $di_hola; ?&amp;amp;amp;gt;

2. Nueva constante __DIR__

Esta nueva constante sirve para reemplazar el típico código dirname(__FILE__) que nos devuelve el nombre del directorio en el cual se encuentra el script desde el que se invoca.

3. Mejoras en el operador ternario

Ahora bastará indicar dos opciones para una situación en la que una variable tendrá un valor o no.

Php tomará como buena la opción que tenga un valor true o no sea empty().


echo true?:false;//true

echo false?:true;//true

echo ""?1;//1

echo 0?:2;//2

$array= array()?:array(1);//la variable array contendrá -&amp;amp;amp;gt; array(1);

echo strlen("")?:strlen("a");//1

 4. mySQLInd

Librería cliente entre mysql y php, que no requiere otras librerias clientes intermedias.

Funciona de una forma transparente al programador y de una forma mucho más eficiente que libmysql.

El único inconveniente es que no tiene soporte completo actualmente para PDO, solo para la interfaz mysqli.

*NOTA: este cliente guardará por defecto datos en campos tipo PASSWORD de mysql con compatibilidad superior a mysql4, se elimina el soporte para formatos anteriores dando un error del tipo

“mysqlnd cannot connect to MySQL 4.1+ using old authentication.

 Archivos .user.ini y distintas configuraciones de php para un mismo php.ini

Se pueden usar archivos .user.ini para configuraciones de fastcgi/cgi similares a .htaccess.

Ahora los archivos php.ini podrán contener archivos .ini adicionales con configuraciones especializadas para un directorio concreto.

 5. Namespaces

Los namespaces era una funcionalidad muy esperada por los desrrolladores de php. Ahora gracias a ellos podremos tener un código muchos más limpio y ordenado.

Php 5.3 y superiores soportarán múltiples namespaces por archivo.

Ejemplo de código sin usar namespaces

function common_hacerAlgo(){
/**/
}

class Common_Mailing
{
/**/
}

define('COMMON_CONST','');

common_hacerAlgo();

new Common_Mailing();
COMMON_CONST;

Mismo ejemplo con namespaces


namespace COMMON;

function hacerAlgo()
{}

class Mailing
{}

const CONS = '';

use COMMON as cm;

hacerAlgo();

new Mailing();

CONST;

Cambiar el modo de ejecución de PHP a FastCGI en Plesk Windows

Publicado en Sistemas TI en enero 13, 2010 9:05 pm

En IIS es muy recomendable ejecutar las aplicaciones PHP como FastCGI, la mejora de rendimiento es notable. Además en entornos en los que hay corriendo más de una aplicación php, esto nos permite separar los procesos facilitando la administración y aislando una aplicación de otra.

Utilizando Plesk, por defecto el panel utiliza ISAPI para ejecutar las aplicaciones y permite la elección entre CGI y FastCGI. Nuestro consejo es siempre utilizar FastCGI, a no ser que no nos quede otro remedio.

Establecer FastCGI por defecto

Hay que establecer el valor “fastcgi” en el registro:

# En el registro de Windows vamos a:

HKEY_LOCAL_MACHINESOFTWAREPLESKPSA ConfigConfig

# Y establecemos:

PLESKCP_PHP_MODE -> fastcgi

Luego vamos a la consola (cmd) y desde el directorio %plesk_dir% ejecutamos el siguiente comando para que se apliquen los cambios:

reconfigurator.exe /check=Services

Configuración rápida de Virtual Host en Apache

Publicado en Sistemas TI en enero 7, 2010 9:32 am

Tras tener Apache+php+mysql instalado, llega el momento de crear alojamientos virtuales para nuestros dominios. Apache guarda los archivos de configuración de los Virtual Host en  /etc/apache2/vhosts.d/ si no hemos configurado ninguno allí veremos las plantillas que podemos usar como base (una con ssl y otra sin ssl).

En el ejemplo, voy a crear un archivo de configuración para Linube en openSuse.

# Nos movemos al directorio de configuración vhost
cd /etc/apache2/vhosts.d
# Copiamos la plantilla a un nuevo archivo
cp vhost.template linube.conf
# En otra distribución seguramente sea /var/www/vhosts/
mkdir -p /srv/www/vhosts/linube/

Es importante tener en cuenta que el archivo de configuración debe terminar con el sufijo “.conf” para que Apache lo lea.

Debemos editarlo y sustituir el dominio de ejemplo “dummy-host.example.com” por el nuestro, así como las rutas que en nuestro ejemplo es /srv/www/vhosts/linube/. Sobre todo establece correctamente el DocumentRoot y donde dice <Directory “/srv/www/vhosts/dummy-host.example.com”>

Reiniciamos Apache y listo.

/etc/init.d/apache2 restart

Instalar extensión php-memcached en Suse Linux

Publicado en Desarrollo web Sistemas TI en enero 6, 2010 9:00 am

PHP-memcached es un sistema que permtie almacenar datos en la memoria RAM. Información que puede solicitarse utilizando las librerías de los diferentes lenguajes de programación a través de cadenas hash. Así, no será necesario buscar en la base de datos, ya que la información estará disponible en esta memoria. De esta forma, las solicitudes se sirven en un período de tiempo menor.

Aunque este tutorial está escrito pensando en una distribución Suse y openSuse, se podría aplicar a otras como debian. Antes de nada, tenemos dos opciones a elegir: php-memcached o php-memcache. Las dos funcionan igual en la capa de programación php, pero tienen las siguientes particularidades:

php-memcache: Es la extensión más antigua de las dos, no requiere librerías adicionales.

php-memcached: Es la extensión más nueva, pero desarrollada por Andrei Zmievski (desarrollador del core de php) y requiere libmemcached. Yo he elegido esta, porque me da más confianza que Andrei sea el responsable de su desarrollo.

* Nota: si usas symfony 1.2 o inferior, debes usar la extensión php-memcache

Instalando php-memcached

Comencemos pues descargando la extensión libmemcached y la compilamos.


wget http://download.tangent.org/libmemcached-0.35.tar.gz

tar -xvf libmemcached-0.35.tar.gz

cd libmemcached-0.35/

/configure

make

make install

Ahora nos tendríamos que bajar la extensión php-memcached del sitio web pecl, pero antes debemos instalar las librerías de desarrollo de php, para poder compilar dicha extensión.

#instalamos las librerías de desarrollo de php
zypper install php5-devel

#ahora nos bajamos la extensión de pecl
wget http://pecl.php.net/get/memcached-1.0.0.tgz
cd memcached-1.0.0/

#hacemos un phpize para generar el configurador
phpize

#compilamos
/configure
make
make install

Por último debemos crear el archivo /etc/php5/conf.d/memcached.ini e indicar lo siguiente en él para que php active esta extensión:

extension=memcached.so

Ahora basta con reiniciar el servidor web para disponer de esta extensión habilitada.

Instalar LAMP (Linux+Apache2+MySQL5+PHP5) en openSuse 11.2

Publicado en Sistemas TI en enero 5, 2010 9:12 am

LAMP es el acrónimo formado por algunas de las herramientas más importantes y utilizadas para la creación de sitios web. Este completo sistema de infraestructura de internet está compuesto por el sistema operativo Linux, el servidor web Apache, MySQL como gestor de bases de datos y PHP como lenguaje operativo.

Como herramienta concentra todas las ventajas del software opensource. Además de proporcionar los conocimientos necesarios para desplegar cualquier tipo de aplicación web. Desde la puesta en marcha de un servidor Apache al desarrollo de la aplicación o su instalación en el servidor.

Puedes utilizarlo en diferentes distribuciones Linux, como por ejemplo openSUSE, una de las distribuciones más utilizadas. OpenSUSE permite desarrollar de forma personalizada y mantener nuevos sistemas operativos basados en Linux.

Instalación en openSUSE

1. Instalar los paquetes necesarios:


# zypper install apache2 php5 mysql

2. Levantar apache y mysql:


# rcapache2 start
# rcmysql start

3. Creamos una configuración segura para mysql:


# mysql_secure_installation

Aquí nos pedirá crear una clave para el usuario root de mysql, eliminaremos los usuarios anonimos y la bd ‘test’ y deshabilitaremos el login remoto con privilegios de root.

4. Abrimos el puerto 80 (HTTP)


# SuSEfirewall2 open EXT TCP http

# SuSEfirewall2 stop

# SuSEfirewall2 start

5. Probamos que todo está instalado correctamente:


# touch /srv/www/htdocs/phpinfo.php
# echo '<?php phpinfo(); ?>' > /srv/www/htdocs/phpinfo.php

Y accedemos desde el navegador a http://ipserver/phpinfo.php. Aquí, fijaros que PHP5 y mysql figuren como instalados.

Enviar correo con gmail en php usando swift mailer 4

Publicado en Desarrollo web en enero 4, 2010 2:53 pm

Swift Mailer es probablemente la mejor librería para enviar correos mediante smtp y sendmail que existe para php. Escrita en 2005 por Fabien Potencier, CEO de Sensio Labs y Lead developer del framework Symfony para php. Inicialmente, Swift Mailer formaba parte de un proyecto académico. Un desarrollo que posibilitaba el envío de correos recurriendo al protocolo SMTP (Simple Mail Transfer Protocol). Desde entonces, la librería ha estado en continua evolución, hasta llegar a convertirse en la biblioteca de complementos que conocemos en la actualidad.

Al igual que muchos otros proyectos de código abierto, el desarrollo de Swift Mailer no hubiera sido posible sin la ayuda de la comunidad. Swift Mailer, además, permite enviar correos electrónicos directamente desde tu aplicación en PHP a cualquier servidor SMTP. Por lo que puedes utilizarlo para enviar al servicio de correo de Google: Gmail. Entre sus principales ventajas se encuentran su facilidad de configuración o la potencia de la librería. Usando esta librería, podrás enviar correos multimedia y consumir menos recursos.  En el caso de envío a gmail, además, podrás elegir el protocolo criptográfico: SSL o TLS.

Enviando emails con SMTP

El siguiente código nos permite enviar correo usando el servidor smtp de gmail con esta herramienta:


 $transport = Swift_SmtpTransport::newInstance('smtp.gmail.com',
                                               465,
                                               'ssl')
              -&gt;setUsername('usuario@gmail.com')
              -&gt;setPassword('tu contraseña');

 //Creamos el mailer pasándole el transport con la configuración de gmail
 $mailer = Swift_Mailer::newInstance($transport);

 //Creamos el mensaje
 $message = Swift_Message::newInstance($subject)
             -&gt;setFrom(array('tuemail@blackslot.gov' =&gt; 'Blackslot'))
             -&gt;setTo($to_addresses)
             -&gt;setBody($body);

 //Enviamos
 $result = $mailer-&gt;send($message);

Extraer elementos de una lista html y exportarlos a un array con php

Publicado en Desarrollo web en diciembre 31, 2009 5:50 pm

Puede que en algún momento de nuestras apasionantes vidas como desarrolladores web nos interese extraer el contenido de cada uno de los elementos de una lista html (<li>,<option> o similares) y almacenarlos en un array para utilizarlos a lo largo de nuestra aplicación.

Me he escrito una función que hace precisamente esto, gracias a la función preg_replace de php.


function li2Array($html,$elemento="li"){

  $a = array("/<".$elemento.">(.*?)</".$elemento.">/is");
  $b = array("$1 <explode>");

  $html  = preg_replace($a, $b, $html);
  $array = explode("<explode>",$html);

  return $array;

}

Solución al error HTTP/1.1 417 Expectation Failed Connection: close Content-Length: 0 en php con curl

Publicado en Desarrollo web en diciembre 31, 2009 8:32 am

Cuando desarrollamos con php haciendo uso de la librería curl, para hacer peticiones http post, nos podemos encontrar con el siguiente error al mostrar las cabeceras de respuesta: “HTTP/1.1 417 Expectation Failed Connection: close Content-Length: 0

La solución al problema es enviar el campo Expect (basta con enviarlo vacío) dentro de las cabeceras http de la petición. Lo vemos en el siguiente ejemplo:


$ch = curl_init();

//metemos el campo expect en la cabeceras

curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers = array( "Expect:"));