Esta semana me he encontrado con un problema que me dió muchos quebraderos de cabeza pero que por suerte llegué a una solución :)
El problema surgía al manipular cadenas de caracteres en php codificadas en UTF-8 con funciones del tipo ucwords, strtoupper, etc...
Al pasarlas por éstas funciones, algunos caracteres se corrompían, y se guardaban erroneamente.

Indagando un poco encontré la explicación a todos éstos problemas.
Las funciones de manipulación de strings en PHP están programadas para trabajar con caracteres de 1 byte de longitud. De ésta manera, funciones como contar el número de caracteres que incluye una cadena (strlen) simplemente calcula el tamaño ocupado en memoria y divide por 1 byte. Todo esto se viene abajo al utilizar cadenas de caracteres codificadas con juegos de caracteres como UTF-8, en los que algunos caracteres pueden ocupar 2 o 3 bytes. Por lo tanto, muchas de las funciones típicas de trabajo con cadenas son peligrosas de usar si nuestros textos están codificados en UTF-8 y son susceptibles de contener éste tipo de caracteres de mayor tamaño, que al leer byte a byte, encontrará erroneamente los datos binarios correspondiente a dos (o tres) caracteres, en vez de uno.

Existe una lista de funciones "inseguras" al trabajar con cadenas con encodings que guarden caracteres de más de 1 byte. Son las siguientes :
· ord
· str_ireplace
· str_pad
· str_split
· strcasecmp
· strcspn
· stristr
· strlen
· strpos
· strrpos
· strrev
· strspn
· strtolower
· strtoupper
· substr_replace
· [l|r]trim (unicamente cuando se usa el segundo parametro)
· ucfirst
· ucwords

Si lo que necesitas es convertir toda la cadena a minúsculas (strtolower), a mayúsculas (strtoupper) o la primera letra de cada palabra a mayúsculas y el resto en minúsculas (ucwords), existe una alternativa que nos evitará tener que cambiar el encoding de nuestra cadena:

PHP:
  1. $string = mb_convert_case($string, TIPO_ACCION, "UTF-8");

Donde TIPO_ACCION  puede tomar los  siguientes valores para obtener el resultado equivalente:  "MB_CASE_LOWER" (strtolower), "MB_CASE_UPPER" (strtoupper)  , "MB_CASE_TITLE" (ucwords)

mb_convert_case es una función que permite la manipulación de los caracteres de una cadena de tipo multibyte.

Tienes muchas más funciones para cadenas multibyte.

Un saludo !

Hace tiempo que llevo pensando en escribir un pequeño artículo sobre los Aceleradores de php. Y ésta semana, aprovechando que he instalado uno en una nueva máquina para hostear éste y algunos otros blogs más, me he animado a ello.

Lo primero de todo, es entender qué es un Acelerador de php.

Como su nombre bien indica, un acelerador de php es "algo" (ahora veremos qué..), que acelera nuestro código escrito en php. Si reflexionamos un poco llegaremos rápidamente a unas sencillas preguntas ¿Cómo puede hacer "algo" que nuestro código se ejecute más rápidamente? ¿Qué hace ésto que parece tan mágico? ¿Retoca nuestro codigo en tiempo real para optimizarlo? ¿Mágicamente hace que nuestro código consuma menos recursos?

Por supuesto que no...

La explicación es mucho más sencilla de lo que parece.
Como bien sabemos, php no es un lenguaje compilado, sino un lenguaje interpretado (script). Cuando nuestro servidor Apache, o un comando CLI llama al intérprete de php para que ejecute un determinado archivo, nuestro intérprete genera en tiempo real los opcodes necesarios para su ejecución. Cada vez que se llama a ejecutar uno de nuestros archivos, nuestro intérprete vuelve a compilar en tiempo real nuestros scripts, incluso cuando llamamos a un script que se haya ejecutado anteriormente. Es aquí donde entran en juego los Aceleradores de php. Su función es simplemente la de recubrir todo el proceso de compilación, guardar los estados compilados de nuestros scripts en memoria, y facilitar una interfaz automatizada que evalúa si es necesario compilar un script o si disponemos de una copia ya compilada en memoria. Osea, que un Acelerador de php, no es más que un "cacheador" de opcodes.
Imaginaos cuánto tiempo y recursos ahorramos al evitar el compilado de toda nuestra home, o de nuestras páginas más visitadas.

La mejora de rendimiento es asombrosa, incluso podremos llegar a ver mejorado el rendimiento de carga de algunas páginas por 3.

Ésta es una de la mejoras de optimización más sencillas que podemos llevar a cabo en nuestro servidor web, y sin duda una de las mejores en relación dificultad de aplicación / mejoras claramente visibles obtenidas.

Existen muchos Aceleradores de php , como APC, eAccelerator, xCache , PHPA, ...
Para gustos, colores. Seguro que encontrarás rápidamente un montón de comparativas, articulos a favor, en contra, y demás ...

Yo voy a explicar cómo instalar xCache (en una máquina Ubuntu). Por su extrema sencillez de instalación y excelente rendimiento.

Continue Reading →

PHP Conference 08 - BarcelonaÉste fin de semana asistimos ivan, munix , alex y yo al PHP Conference 08 que se celebraba en Cornellá , Barcelona.

Después de un accidentadísimo viaje en el que pillamos un tren de 9 horas desde Madrid que pensábamos teníamos camas, llegamos a Barcelona. Pillamos el metro hasta Cornellá caminamos hasta llegar a estar a unos 50 metros del Citylab, donde se celebraba el evento. Al llegar a esa altura, por alguna extraña razón pensamos : "No, ... creo que por aquí no es. Vamos a dar la vuelta y tomar otro camino". Creo que llegamos a caminar unos 4 kilómetros y a tirar a la basura la hora de antelación con la que habíamos llegado. Entonces llamamos a un taxi que nos llevó al Citylab. Imaginaos nuestras caras cuando nos dimos cuenta lo cerca que estubimos de allí.

Después de acreditarnos, entramos a tiempo a la primera charla de Marcus Bointon sobre Emailing en PHP. Fué bastante entretenida. Nos contaron qué librerías había disponible para el envio de mails desde php y sus características. Aunque luego la explicación detallada, trucos, consejos y demás, estuvo enfocada al uso de phpmailer.
Luego fuimos a una interesantísima charla llamada "How to Pimp High Volume websites" por Jens Bierkandt,  uno de los desarrolladores de Softonic. Esta es la charla que más me gustó y a la que creo que más pro,vecho sacaré. Nos hablaron tanto de cómo organizar una arquitectura basada en balanceo de servidores web, replicación de servidores de bases de datos, cachés, uso de memcached, utilidades de diagnóstico y seguimiento , etc...
Me alegró saber que todas las acciones que habiamos llevado a cabo en minube nos las recomendaron allí, pero también me alegró conocer nuevas formas adicionales que aún no habíamos llevado a cabo.

Luego asistimos a la ponencia de Zoë Slattery sobre indexación y motores de búsqueda en php. Ésta me interesó menos, ya que no se habló sobre metodologías a seguir, o formas de desarrollar un buscador , sino del comportamiento interno de php a la hora de analizar formalmente los textos, extracción de tokens , etc...

La última de las charlas fué la de XDebug por Derick Rethans, donde nos presentaron la herramienta de debuggin y nos explicaron cómo configurarla, y ponerla en práctica. Además de algunos trucos, herramientas complementarias e incluso extensiones de firefox para trabajar con el debuggin de XDebug.

Me perdí una charla sobre SQLite 3 , ya que estaba un poco cansado y aproveché para conectarme a internet un rato , y cargar el portatil (que durante el viaje escasearon mucho los enchufes)

A las 6 o así acabó todo con la keynote de despedida y un sorteo de algunos regalos (no me llevé nada :P ).
Después de eso ya sólo nos quedó otras 9 horas de viaje de vuelta en el tren Estrella de Renfe ... que dudo vuelva a coger en mi vida.
Si queréis podeis ver algunas de mis fotos del viaje y la conferencia, y algunas otras de Alex

Esta semana me he puesto ya en serio a prepararme para la certificación Zend de Ingeniero PHP.

Entre el temario del primer capítulo, encontré dos operadores que jamás había usado y me llamaron mucho la atención porque ni siquiera los había visto usados en algún otro script php. Me sonaban de cuando había estudiado C en la universidad, y efectivamente hacen lo mismo.

Los operadores "<<" y ">>" realizan un desplazamiento binario de n posiciones, hacia la izquierda o a la derecha respectivamente.

Para el que no sepa exáctamente qué es un desplazamiento binario, lo explico:

La representación binaria de 5 (decimal) es 101. Un desplazamiento binario nos sirve para desplazar, a la izquierda o a la derecha, sus dígitos.  Por lo que un desplazamiento binario de 2 posiciones sobre el numero 5 nos daría como resultado el binario 10100 (20 en decimal).
Su uso puede ser bastante útil y extremadamente eficiente cuando queremos multiplicar un número por alguna potencia de dos, ya que, internamente, el desplazamiento binario será mucho más rápido y requerirá menos operaciones que la multiplicación.

Su sintaxis es muy sencilla, y como cualquier otro operador aritmético, su asociatividad de izquierda.

PHP:
  1. $a &lt;&lt; n;

Donde n es el número de desplazamientos que queremos hacer hacia la izquierda.

Nota adicional: si pretendemos usar el desplazamiento binario tenemos que tener cierto cuidado y conocimiento de las características técnicas de la máquina en la que estamos corriendo el script. Ya que si estamos utilizando una máquina de 32bits , los datos se almacenarán, como es lógico, en palabras de 32 bits, y si intentamos realizar un desplazamiento binario de 32 posiciones, obtendremos como resultado un estupendo overflow.
Por lo que si queremos multiplicar por potencias de 2 , tened cuidado de cuántas posiciones desplazais, ya que a veces os convendrá más utilizar la función pow(n,m);