sábado, 19 de noviembre de 2011

Automatizar Scripts de PHP

Ya la vez anterior hable de un script escucha puertos, pero teníamos que ejecutarlo manualmente, pues ahora veremos cómo automatizar dicho proceso, concretamente en Windows ya que en Linux es más fácil al usar el CRON con CURL (hay mucha documentación en español sobre este tema) con esto lograremos ejecutar el script no solo de forma automática sino además de no depender de un navegador para que se ejecute nuestro script en pocas palabras se ejecutara en segundo plano,  pero en una entrada posterior hablare de cómo automatizar scripts en Linux.

En Windows el problema se complica ya que para ello tendríamos que usar el siguiente el script lanzador, ya que no funciona igual que con Linux.

< ?php
exec('psexec -d C:\ruta_al_exe_php\php.exe -f script_escucha_puertos.php');
?>


En donde psexec es un ejecutable que no viene en PHP y se deberá subir en el mismo lugar en donde se encuentra el script lanzador,  el psexec lo pueden descargar de aquí:

http://www.softpedia.com/progDownload/PsExec-Download-35253.html

-f script_escucha_puertos.php  es el scrit que se lanzara, por supuesto aquí deben usar el que vayan a automatizar.

Con esto solo llaman desde el navegador una única vez al script lanzador y se puede cerrar posteriormente.

Espero que les sea de utilidad.

Saludos y hasta la próxima.

jueves, 17 de noviembre de 2011

Script PHP escucha puertos

Este es un script que puede ser de mucha o poca utilidad lo hice por motivos de aprendizaje, dada la poca documentación en español decidí escribir este artículo que tal vez a alguien le sirva, bien este pequeño script escucha lo que llega a un puerto UDP cualquiera.

<?php
set_time_limit(0); //para que no sea interrumpido el script
while(true){ //iniciamos un bucle infinito para que siempre escuche en el puerto
      $sock=socket_create(AF_INET,SOCK_DGRAM,SOL_UDP); //crea el socket
      if($sock===false){ 
            echo 'socket_create Fallo: '.socket_strerror(socket_last_error());
            break;
      }
      if((socket_bind($sock,"127.0.0.1",2222))===false){ //aquí configuramos la IP
// y el puerto de escucha, por ahora está en localhost para las pruebas, puerto 2222
            socket_close($sock);
            echo 'socket_bind Fallo: '.socket_strerror(socket_last_error());
            break;
      }
      socket_recvfrom($sock,$buf,1024,0,$clientIP,$clientPort); //aquí hace la 
//lectura de lo que está llegando al puerto, 1024 es el tamaño en bites a leer
      if($buf===false){ 
          echo 'socket_recvfrom() Fallo: '.socket_strerror(socket_last_error());
      }elseif(strlen($buf) === 0) {
          echo 'socket_read() Cadena vacia: '.socket_strerror(socket_last_error());
      }
      echo "Lectura: $buf"; //aquí muestra en la pagina lo que lee o podemos 
//agregar el código que por ejemplo envié los datos y los almacene a una base 
//de datos o aun archivo

      // Ahora se puede interactuar con el cliente responder 
      /*if(!socket_connect($sock, $clientIP, $clientPort)){
           echo 'socket_create Fallo: '.$clientIP.':'.$clientPort.' : '.socket_strerror
(socket_last_error());
            socket_close($sock);
      }*/

      socket_close($sock);//se cierra el socket de lo contrario no podrán 
//depositarse datos en el puerto
} 
?>

Ya podrán ajustar el código a sus necesidades, básicamente lo que hace es crear un socket en cada ciclo y conectarse al puerto UDP y empezar a leer y luego cierra el socket esto debe ser así si planeamos interactuar con los clientes ya que si no, no permitirá la conexión de más clientes, indicara que está ocupado, al principio podrá parecer que no funciona pero en realidad está en escucha, para ver que realmente está funcionando utilicen algún programa para enviar datos al puerto UDP y si dicho programa tiene una función para enviar periódicamente datos, mejor aun, por ejemplo que tenga un timmer, pueden ajustarlo para que envié un "hola mundo" cada 500 mili segundos y verán que después de un rato el script libera los echos y sigue ejecutándose y periódicamente mostrara en pantalla la información enviada.

Para propósitos de prueba pueden usar el siguiente programa aunque sea un trial tiene un modulo muy útil que es un cliente UDP y tiene la función timmer para enviar información periódicamente.

http://download.cnet.com/Network-Traffic-Generator-and-Monitor/3000-2085_4-10668961.html

Para hacer lo mismo pero en TCP solo hay que cambiar la línea

$sock=socket_create(AF_INET,SOCK_DGRAM,SOL_UDP); por esta otra

$sock=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);


NOTA MUY IMPORTANTE habrá que habilitar el uso de sockets en PHP para que funcione este script, en el directorio de extensiones del interprete PHP se deberá tener la dll o el .so (linux) llamado php_sockets.dll, además en el archivo php.ini habrá que habilitar dicha extensión con: “extension=php_sockets.dll”

Bueno llegados a este punto resulta que nos daremos cuenta que solo ejecutando un navegador es cómo funciona el script y ahora tenemos el siguiente problema como rayos voy a estar ejecutando el script manualmente, bueno si tu hosting esta en linux la solución es muy simple. Pero en la próxima entrada hablare de cómo hacer para que se ejecute automáticamente.

Nota: el script no es lo más óptimo para esta tarea, lo mejor es una aplicación de escritorio que realice dicha tarea, aunque este script puede cumplir con tareas sencillas, ademas si van a usar bases de datos para almacenar la información que llegue, utilicen conexiones persistentes en php.

Saludos.

sábado, 12 de noviembre de 2011

HTML5 ¿porque empezar a usarlo?

Hoy hablare de HTML5 y aunque aun está en fase de desarrollo como lo indica la misma W3C ya es usado por muchos desarrolladores, pero ¿a que tecnologías pretende reemplazar o por lo menos presentarse como alternativa?¿o porque empezar a usarlo? básicamente pretende suplantar a html4 y xhtml estricto, aunque también pretende presentarse como alternativa a flash en videos, ya que insertar videos en una web será tan fácil como el siguiente código:


<video controls="controls" height="240" width="320">

<source src="movie.mp4" type="video/mp4"></source>

<source src="movie.ogg" type="video/ogg"></source>

</video>


Y están soportados formatos como MPEG y ogg, pero algunos benchmark indican que html5 no es tan eficiente como flash para reproducir videos al menos en Windows ya que en Mac la historia es otra, esto se debe a que flash cuenta con aceleración por hardware en Windows, pero aquí hay que hacer una acotación muy clara, esto no es problema del estándar html5 en sí, si no de que el navegador implemente esta parte.

También es sonado que hay una especie de guerra entre flash y html5, yo creo que más bien es un pleito como los que seguido se escuchan entre compañías cuando entran en conflicto sus intereses, por ejemplo que si las ipad no traen soporte para flash y bla bla, yo creo que por ser un estándar libre ya tendrá muchos a su favor a diferencia de flash.

Desde el punto de vista de un desarrollador esta actualización de HTML trae muchas ventajas, por la simplicidad y la llegada de nuevas capacidades como la de video, audio, canvas. Una capacidad muy apreciable y que seguro ahorrara mucho código es la propiedad “required” que ahora podrá usarse en todos los inputs de un form, ejemplo:

<input type=”email” name=”x” required />


Esto hará que le salte al usuario un mensaje si no llena ese campo, además también saltara un mensaje de error si el campo no tiene el formato de un correo electrónico ya que el nuevo type “email” así lo valida. Pueden ver una guía de referencia donde podrán encontrar muchos de los nuevos tags que incorpora html5 desde aquí http://www.w3schools.com/html5/html5_reference.asp

Canvas permitirá la creación de imágenes 2D con lo que se podrán hacer jueguitos XD, pero una capacidad que cobra especial atención es la incorporación del soporte a la web 3.0 la web semántica, se define como la interoperabilidad entre aplicaciones, servicios y páginas web para reunir o comunicarse información entre si y así ofrecerla al usuario final, sin necesidad de intermediarios es decir de forma totalmente automática por maquinas de procesamiento “agentes inteligentes” que harán las búsquedas por nosotros y nos ofrecerán la información que nos interesa basados en el contenido, significado y relación de los datos. A penas acabamos de comprender el concepto de web 2.0 y ya surge la 3 y es que en mi opinión personal y un tanto dividida, parece un poco prematuro crear una tecnología para un concepto a penas naciente con lo cual parece que habrá futuras correcciones y modificaciones, pero es bueno que haya un iniciador que abra camino en este ámbito y que mejor que un estandar y así lo tengamos más fácil los desarrolladores, ya que la irrupción de la web 2.0 fue un tanto violenta, confusa y sin orden. Con lo que la estructura de una pagina web en html5 y atendiendo a la web semántica quedaría así:


Como se puede apreciar html5 tendrá mucho éxito, sera el estandar con el que se maneje la semantica de la web 3.0 y ya es soportado en su mayoría, por la mayoría de los navegadores aunque internet explorer sigue siendo una pesadilla para nosotros los desarrolladores web, saludos y hasta la proxima.


Aquí unos enlaces interesantes por si les entro curiosidad por la web 3.0, que al final tendremos que mirar hacia allá.

http://www.genbetadev.com/desarrollo-web/introduccion-a-la-web-semantica-en-html5
http://css3html5.com.ar/html5-y-la-web-semantica/

de html5

http://html5tutorial.net/
http://www.desarrolloweb.com/manuales/html5-internet-explorer9.html

jueves, 10 de noviembre de 2011

Optimizar PHP la optimizacion Extrema final

Si así es, siguiendo con el tema que ya lo toco de forma casi obsesiva jejeje pero esta vez no se salvan los de java XD (y dale contra los de java, no se crean no es nada en contra, pero java en web es un buen referente con el cual comparar) pero esta vez los ingenieros de Facebook el cual fue desarrollado en PHP, le retribuye algo, se trata de HipHop PHP un compilador que traduce el código PHP a C++ ¿Cómo? Si a C++ ni más ni menos, ya se imaginan el rendimiento simplemente supremo, es mas pondré textualmente como aparece en su página oficial.

“transforms PHP source code into highly optimized C++”


Es algo que ni yo esperaba, pero deduzco que con esto se optimiza tanto la ejecución de PHP (aunque en realidad ya no lo es XD) al grado de competir en rendimiento con Java, no ha habido benchmarks comparando a Java con esto ya que es nuevo y casi nadie lo conoce (pero puedo imaginar los resultados).


A esto le veo 2 ventajas, una que el programador ya no se tendrá que romper la cabeza programando en el tortuoso pero todo poderoso C++ (es como si C++ fuera tan fácil de programar como PHP con su maravillosa colección de funciones que te permiten programar de todo y sus estructuras de muy alto nivel que caracterizan a los lenguajes de scripting) y dos tienes la eficiencia y velocidad de C++. Un híbrido maravilloso.

Por desgracia todavía está en una fase incipiente y solo está disponible para Linux y en 64 bits.


Pero por ahora pueden deleitarse con este benchmark en el que comparan PHP normal vs PHP + APC (ya en un post anterior trate el tema de APC en PHP) vs HipHop PHP con Drupal 7 un CMS y los resultados demuestran que los scripts compilados con HipHop PHP son hasta 5 veces más rápidos que PHP tradicional y 2 veces más rápidos que PHP con APC.


Es bueno que estas empresas usen software libre, ya que por lo visto suelen retribuir con cosas tan buenas como estas, es algo parecido a lo que ya ocurrió con Google en java script con su jquery y en python con su Google App Engine


Aquí está el benchmark para que vean las graficas. http://php.webtutor.pl/en/2011/05/17/drupal-hiphop-for-php-vs-apc-benchmark/


Y este es el sitio oficial del proyecto. https://github.com/facebook/hiphop-php/wiki/


Saludos y hasta la próxima.

sábado, 5 de noviembre de 2011

Optimizar el codigo PHP

Bueno esta vez les hablare de algunas recomendaciones, que te pueden ayudar a que tu código PHP sea mas optimo y consuma menos recursos de tu servidor.

Empezaremos por mencionar las funciones de PHP debes usar en de que (mas rápido / menos optimo) ok al grano:

1- no abuses de las variables globales, trata de usar variables locales ya que son dos veces mas rápidas.

2- siempre incrementa tus variables de la siguiente forma:
++$variable //es mas rápido que
$variable++


3- Al hacer tus comparaciones con valores constantes, pon estos primero y después lo que quieres comparar, ejemplo:
if(FALSE===$variable){
//codigo
}


4- usa en las comparaciones el operador lógico === en vez de == ya que el primero compara directamente sin convertir tipos de datos lo que si hace la segunda, por eso es mas lenta, claro esto solo si sabes que son exactamente del mismo tipo, ejemplo 1=="1" devolverá true pero 1==="1" devolverá false.

5- siempre declara tus variables y si son contadores o variables que se incrementara, considera declararlas con un valor inicial, ya que sera mas rápida al usarse después.

6- Procura no usar mucho la estructura de control switch ya es muy lenta, es preferible usar if.

7- echo es mas rápido que print.

8- si escapas código HTML, mejor cierra la etiqueta PHP (?>) escribe el HTML que necesitas y vuelve a abrir la etiqueta PHP (<?php) y continua con tu script.

9- no uses @ para suprimir errores, este ralentiza mucho tu script, corrige el error o desactiva los errores desde php.ini o con error_reporting(0)

10- para comprobar si una variable existe y no esta vacía usa isset() ya que es mas rápida que empty()

11- foreach es mas rápido que for.

12- nunca evalúes el tamaño de un arreglo en un for, siempre guárdalo en una variable y luego úsala en el for, ejemplo:
$cont=count($array);
for($i=0;$i<$cont;$i++){ //codigo }


13- las comillas dobles buscan variables dentro de la cadena para concatenarlas, usar comillas simples es mas rápido, ejemplo:
$var="mundo";
echo "hola $var"; //mas lento que
echo 'hola '.$var;


14- a menos que no uses expresiones regulares, usa explode ya que es mas rápido que split (que es el que te permite el uso de expresiones regulares) .

15- Utiliza pocos accesos a la base de datos. Al realizar una consulta selecciona solo los campos que necesites. No utilices "SELECT * FROM tabla" si no lo necesitas, utiliza "SELECT campo, campo FROM tabla".

16- procura hacer las validaciones de tu formularios con JavaScript de lo contrario tendrías que recargar la pagina cada vez que el usuario se equivoca, mejor ayúdate con JS y luego como seguridad extra valida los datos de tu formulario con PHP una vez enviados para estar seguros (no falta el vivo que desactiva JS en su navegador) pero así solo sera una vez y no cada que se equivoque el usuario.

17- Finalmente que PHP se "pre-compila" a un código objeto que luego es ejecutado (opcodes) la buena noticia es que se puede hacer cache de este código y mantenerlo residente en la RAM del servidor con lo que aumenta hasta en un 100% la eficiencia de PHP, para esto de puede ayudar mi post al respecto aqui

Hasta la próxima y feliz codificación ;)

Saludos.

miércoles, 2 de noviembre de 2011

Comparativa python vs php vs java

Pues ahora les traigo una comparativa entre estos lenguajes aplicados a la web (bueno en el caso de php ya es de naturaleza web pero no en el caso de python o de java).

Php es un lenguaje muy maduro que ha estado en el mercado hace ya muchos años (1995) y como principales ventajas tiene:

1- una gran comunidad de programadores que te pueden ayudar cuando te atores en algo
2- su curva de aprendizaje es muy suave ya que es muy sencillo de aprender (ademas de su gran parecido con c)
3- la cantidad de bibliotecas que te simplifican el desarrollo de cosas como creación de imágenes y pdf manejo de sockets y bases de datos de una forma muy simple y sencilla, por lo tanto
4- desde el punto de vista de un negocio el tiempo de desarrollo en php es mínima y muy rápida lo que se traduce en alta productividad.
5- la implementacion es muy simple por lo tanto la oferta de hosting que soportan esta tecnología es gigantesca.

como desventajas tiene:
1- es muy lento lo que en sitios web que tendrán muchas peticiones por segundo o cargas muy pesadas de acceso a BD, no sera la mejor opción
2- si bien la persistencia de datos existe al serializar manualmente o por medio de sesiones, no existe la persistencia de objetos lo cual puede llegar a ser una gran desventaja al programar OOP.
3- es un lenguaje que al principio no soportaba OOP por lo que hacer código spaguetti es muy facil y casi involuntario, ademas de que en algunos benchmark demuestra ser lento al ejecutar OOP que simple código estructurado.

Java es un lenguaje también muy maduro y con mucha experiencia y tiene como ventajas:
1- al igual que en php una gran cantidad de programadores te pueden ayudar
2- gran potencia y velocidad, ya que se usan servlets y existe persistencia de objetos.
3- es un lenguaje totalmente OOP por lo que es imposible programar feo (o al menos no como en php XD)

como desventajas:
1- su curva de aprendizaje es muy pesada, ya que este lenguaje es muy complejo, lo cual no lo hace justificable si tu desarrollo es medianamente simple.
2- el tiempo de desarrollo y por lo tanto su productividad no es tan bueno que como en php al menos en desarrollos relativamente simples como sitios de e-comerce, uso de base de datos sencillo. Aunque en sitios mas complejos donde la carga de consultas a bases de datos sea muy alta es mejor Java.
3- la implementacion de esta tecnología es mas costosa por lo tanto es mas escasa la oferta de hosting para la misma.

Python es un lenguaje mas parecido a java que a php (en su forma de operar) y aunque mas antiguo que php (1991) su incursión en la web a sido muy escasa, si bien es un lenguaje interpretado al igual que php, se parece mas a java y si lo piensan bien java también es interpretado ya que la compilación autentica no se da en estos lenguajes no como en c o c++, ambos tanto java como python traducen el script a un bytecode (muy parecido al lenguaje maquina) a diferencia de php que sus opcodes son mas parecidos al lenguaje ensamblador, y los bytecode son mas óptimos, por lo tanto python es mas eficiente en su ejecución que php aunque no se le acerca a java, PERO hay una configuración para python, que me gusta y por la que apuesto todo, se trata de un framework que soporta sesiones, mvc y mas importante SERVLETS así es python puede manejar servlets como java con este framework, por lo que su desempeño mejoraría muchisimo que me atrevería a decir que le anda pisando los talones a Java, pero de eso hablare mas adelante en un benchmark que pretendo hacer en estas 3 tecnologías.

como principales ventajas tiene:
1- curva de aprendizaje muy suave, es un lenguaje que se puede jactar de ser de muy alto nivel casi aproximándose al lenguaje humano, dejando atrás a java y php en este sentido.
2- se ejecuta como lo hace java con bytecode lo que lo hace muy rápido resultando estar en medio entre php y java en rapidez.
3- también implementa una gran cantidad de bibliotecas para hacer maravillas como sucede en php

como desventajas:
1- no hay muchos programadores en esta tecnología y la documentación es muy escasa en español y en ingles también aunque hay mas que en español.
2- implementar esta tecnología en web es muy compleja por lo tanto los hosting que soportan python son todavía mas escasos que en Java.

Este es un análisis simple  de estas tecnologías, iré haciendo mas análisis de estas tecnologías mas adelante y mas completas, esto es una introducción.

Solo como reflexión final y casi a modo de estocada final y letal, los que estamos a favor de python como es mi caso, podemos presumir de tener como respaldo a empresas tan grandes como ni mas ni menos Google, Yahoo y Nasa, estas tres empresas tienen sus sitios web en python.

Cabe reflexionar que estas empresas tienen equipos de ingenieros muy capacitados (de lo merjor del mundo) y que si voltearon sus ojos a esta tecnología es por algo ¿no creen?

Saludos.