PHP5

No te confies de todo lo que dice el manual de PHP

Hace unos días haciendo unos benchmark a kumbiaphp framework en comparación con la vieja estructura de directorios de alguna para ver si la nueva estructura directorio genero efectos de rendimientos sobre el framework que seria lo ideal.

Bien lo cierto es que cuando se corrió el benchmark los #request/seg no cuadraban y no era lógico ya que la nueva estructura se depuraron ciertas cosas que sobraban, en el benchmark los números obtenidos eran tan locos que la vieja estructura tenia unos 10 #req/seg por encima :-S no era nada normal esto, nos toco recurrir a las buenas prácticas de desarrollo y que ya es una constante dentro del Equipo de Desarrollo de kumbiaphp hacer debug y profiler con xdebug :-), esto para detectar donde estaban los “cuellos de botellas” que nos hacían mas lento que la versión anterior.

El detalle estaba en una función de PHP llamada extract, dentro de kumbiaphp framework se utiliza esta dicha función en el core ya que el framework implementa las variables de instancia (algo muy parecido de Rails), es decir todo lo que llame en mi controlador $this->var o sean atributos públicos, en la vista los tengo disponible como $var, volviendo al punto esta funcion nos permite hacer lo antes dicho pero recibe ciertos parámetros uno es unas constantes entre ellas EXTR_OVERWRITE (Si hay colisión, sobrescribe la variable existente) nosotros decidimos sacar la constante porque en la documentación Oficial de PHP dice claro lo siguiente:

Si no se especifica tipo_extraccion , se asume que vale EXTR_OVERWRITE.

Bien como sabemos el xdebug nos da mucha información y la misma nos decía que el “cuello de botella” estaba allí ya que tomamos un profiler de la versión anterior y los tiempos eran totalmente distintos en ese punto. viendo en detalle la función extract decidí olvidar lo que dice el manual de PHP y pasar de forma implícita el tipo de extracción en este caso EXTR_OVERWRITE, una vez hecho el cambio vuelvo a correr el benchmark y como por arte de magia ahora obtengo los resultados esperados la nueva estructura ha causado efecto en velocidad y esta ~10 #req/seg por encima respecto a la vieja estructura.

Conclusión.

Tal como dice el titulo del post no hay que confiarse de lo que dicen algunos manual, ya que pueden ocurrir excepciones como la que comente aqui. En el caso descrito fue detectado este detalle porque se hizo uso de las buenas prácticas de desarrollo y de las herramientas disponibles y el turno fue para una que muchos obvian (xdebug), que si le damos el uso correcto podemos ganar mucho en nuestros desarrollos.

  • Share/Bookmark

Filter un misterio de PHP.

Todas las aplicaciones (Web, Escritorio, Consola) dependen que datos externos para crear una salida o iniciar un proceso, estos datos pueden venir desde un usuario u otra aplicación (WebService, formulario, etc…) por eso la premisa #1 de todo desarrollador debe:

Filtrar todos los datos externos

El filtrado de datos es una de las piedras angulares en cualquier aplicación en el tema de seguridad, independientemente del lenguaje donde se trabaje. PHP proporciona una amplia gama de herramientas y funciones para filtrar o validar los datos, pero a diferencia de otros lenguajes, no tiene funciones estándar para filtrar los datos (como cgi de perl).

La extensión Filter llena este vacío y viene a suplir muchas expresiones regulares que son extremadamente lentas para validar formatos y datos de entradas, estas son muchas de las bondades de PHP que muchos desarrolladores no suelen utilizar y que vienen a ser parte de las buenas practicas de desarrollo sobre este lenguaje.
Lee el resto del articulo »

  • Share/Bookmark

Prof. Charlatan + Buenas Prácticas PHP + Parte I

Pirata

Este termino comencé a ver una materia que se llama Procesamiento de Datos (Programación PHP) y es triste ver como un profesor le cae a mentira a un grupo de alumnos, que en vez de dedicarse “enseñar”, busca “sorprender” a un conglomerado, como se que esto dará mucho que hablar hoy comienzo una serie de post donde rescatare las carencia de este profesor, por razones obvias no daré su nombre (Espero lea este post profesor) y que NO se consideran como buenas prácticas de desarrollo en PHP.

Aclaro que No es un Flame contra este profesor, son simplemente aclaratorias que desde mi modesto punto de vista no puede quedar “impune” de la misma forma sirva para incentivar a las personas y/o alumnos(hasta al mismo profesor) a buscar información antes de decirla y/o creerle a cualquiera y mas en el área de la programación debido a que existe mucha información en la web.

Hay cosas de “ABC” que cualquier desarrollador de aplicaciones web debería tener claro, en este caso para PHP y es que las aplicaciones web de hoy día necesitan ir rápido, y rápido no se traduce es hacer códigos pequeños sino en implementar buenas prácticas.

Lee el resto del articulo »

  • Share/Bookmark

Compartiendo mi conexión…

Al fin Juan Carlos y yo nos sentamos hacer un trabajo que desde hace tiempo teníamos pendiente y era el hecho que compartir mi conexión a internet por razones obvia (chulear mi conex), actualmente me conecto mediante un Modem CDU 680 CMOTECH.
Explicando un poco que vamos hacer la idea es que cualquier persona tenga conexión a internet ya sea mediante mi interfaz de Red o Inalambrica, estas opciones son validas de acuerdo el caso que se presente pero focalizando el escenario que tengo y es que el modem CDU se conecta a mi PC mediante USB, es decir cuando establezco la conexión tengo interfaz PPP, la idea es que mi PC sea el gateway de las maquinas que se van a conectar.
Los instrumentos que necesitamos es un cable de red directo, NO cruzado y es por hecho que en distribuciones Linux automáticamente este cable se vuelve cruzado por software, hagamos la prueba para comprobar esto que les digo :-).
Conectemos ambas PC’s una vez que tengamos la dirección IP 169.254.xxx.xxx, asignemos direcciones IP a estos computadores:

PC-1

# ifconfig eth0 192.168.0.2

PC-2

# ifconfig eth0 192.168.0.3
# route add default gw 192.168.0.2

Una vez hecho esto hacemos ping de computador a computador para comprobar que existe conectividad.
Ping desde el PC-2 hacia el PC-1

# ping 192.168.0.2

Debemos obtener una salida como esta:

PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
64 bytes from 192.168.0.2: icmp_seq=1 ttl=64 time=0.036 ms
64 bytes from 192.168.0.2: icmp_seq=2 ttl=64 time=0.036 ms
64 bytes from 192.168.0.2: icmp_seq=3 ttl=64 time=0.031 ms

Esto simplemente para que se vea que no necesitamos un cable cruzado :-), ahora vamos a la parte interesante en esta primera sección lo haremos que nuestra PC-2 se conecte a internet mediante la interfaz de Red utilizando como gateway la PC-1, para esto utilizaremos brctl para crear un puente (bridge) esto lo haremos de la siguiente manera, todos estos pasos se harán en la PC-1:

# brctl addbr br0

donde br0 es un nombre que le damos, puede ser cualquiera, una vez hecho esto levantamos este bridge, que finge como “interfaz”.

# ifconfig  br0 up
# brctl addif br0 eth0

Le damos una dirección IP al bridge br0

# ifconfig  br0 192.168.0.2

Agregamos las siguientes reglas en el Iptables

# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
# iptables -A INPUT -p TCP -m state --state RELATED -j ACCEPT
# echo 1 > /proc/sys/net/ipv4/ip_forward

NOTA: debemos detener el network-manager de la PC-1, ya que este tumba la puerta de enlace y por ende a pesar que de se este conectado por la interfaz ppp0 la PC nunca se “entera” que esta conectada.

# /etc/init.d/network-manager stop

La configuración de la PC-2 ya tiene la dirección IP asignada (192.168.0.3) solo debemos agregar los dns, en este caso utilice los de cantv 200.44.32.12, una vez hecho esto en la PC-2 podemos intentar navegar, ya sea abriendo un navegador o haciendo ping.

# ping www.google.com
PING www.l.google.com (74.125.95.103) 56(84) bytes of data.
64 bytes from iw-in-f103.google.com (74.125.95.103): icmp_seq=1 ttl=241 time=269 ms
64 bytes from iw-in-f103.google.com (74.125.95.103): icmp_seq=2 ttl=241 time=279 ms
64 bytes from iw-in-f103.google.com (74.125.95.103): icmp_seq=3 ttl=241 time=261 ms

Como vemos ya tenemos conectividad hacia internet mediante la PC-1 utilizando la interfaz de red, ahora lo hacemos utilizando la tarjeta inalámbrica de ambos computadores, para esto quitamos el cable de Red para evitar problemas.
En la PC-1 colocamos la tarjeta inalámbrica en mode ad-hoc y añadimos la interfaz inalámbrica por lo general wlan0 al brctl.

# iwconfig wlan0 essid "CaChi" mode ad-hoc channel 11
# brctl addif br0 wlan0

Ahora solo queda conectarse desde cualquier otra maquina hacia la PC-1 de la misma manera, es decir modo ad-hoc y por el canal (channel) 11 y por supuesto colocar los DNS correspondiente, en nuestro caso se colocó los de CANTV 200.44.32.12.
Con esto mis panas de la Universidad y demás, podrán “chulearme” la conexión :-) ahora solo faltaría un QoS.

  • Share/Bookmark

Entendiendo el Modelo Orientado a Objeto de PHP :-)

Dejo una presentación que considero excelente y ayudara aclarar muchas dudas en cuanto al modelo de POO de PHP ya que veo que existe un gran desconocimiento a nivel general y que escala a niveles bien altos en torno a este tema, la invitación es que vayamos a nuevas practicas de desarrollo y dejemos atrás la vieja escuela de esa programación estructurada que no permite que PHP avance como un lenguaje mas serio respecto a otros y esto es producto de los mismo desarrolladores.

Understanding the PHP Object Model

View SlideShare presentation or Upload your own. (tags: php oop)
  • Share/Bookmark
  • Categorías