Probando hostings gratuitos

Servidores

Después de buscar sobre las muchas alternativas que hay de hostings gratuitos, nos hemos decantado por dos para probarlos metiendo proyectos antiguos.

Además, tenían que ser hostings que dieran soporte a php 5.2, que hoy en día no es tan fácil…

El primero que probaremos será:

Freehostingnoads

y después si quedan ganas y tiempo…

Zymic

Ya os contaremos que tal va la cosa… (normalmente se escribe cuando se acaba, pero hoy lo vamos a hacer así) ;-D

Si tenéis cualquier alternativa o experiencia o consejo, no dudéis en comentarlo.

Happy coding!

Concurrencia, bloqueo de código y semáforos en php

PHP

En ciertas ocasiones necesitamos que una parte de nuestro código se ejecute por solo un usuario a la vez.
Estos bloqueos de código los utilizamos para evitar problemas de concurrencia.
En php es posible implementar estos bloqueos mediante semáforos. (Ver semáforos en el manual de php)

El problema es que no siempre nuestro hosting viene con una versión estilo System V (–enable-sysvsem) compilada de php.

Si esto es así, podemos resolver el problema ejecutando el siguiente código:

if ( !function_exists('sem_get') ) {
    function sem_get($key) { return fopen(__FILE__.'.sem.'.$key, 'w+'); }
    function sem_acquire($sem_id) { return flock($sem_id, LOCK_EX); }
    function sem_release($sem_id) { return flock($sem_id, LOCK_UN); }
}

Con esto, ahora ya podemos usar las funciones de php para semáforos (sem_get(), sem_acquire(), sem_release())

Aquí os dejamos un ejemplo práctico de cómo usar los semáforos para obtener el siguiente número de pedido disponible y actualizar el pedido actual:

$sem_key = 12;
$sem_id = sem_get($sem_key, 1);
if (! sem_acquire($sem_id)) die ('Error esperando al semaforo.');


$ref = $model->getNextPedidoReference();
$pedido->referencia = $ref;
if (!$model->Update($pedido)){
    handle_error("Error guardando el pedido");
    return;
}


if (! sem_release($sem_id)) die ('Error liberando el semaforo');

De esta forma ya podemos estar seguros de que no se podrá dar el caso de que dos usuarios obtengan el siguiente número de pedido disponible a la vez y acabes teniendo dos pedidos con la misma referencia.

Happy coding!

Sustituir función eregi por preg_match

PHP

La funcion ‘eregi‘ está obsoleta desde PHP 5.3.

Ahora debemos usar la función ‘preg_match‘ que es compatible con ‘Perl‘.

Para la sustitución, tenemos que tener en cuanta lo siguiente:

1. Es necesario añadir delimitadores a la expresión regular.
2. Algunas expresiones las tendremos que cambiar por sus equivalentes en PCRE (Perl Compatible Regular Expressions).
3. La ‘i’ de ‘eregi’ viene de case-insensitive, que en PCRE equivale a usar el flag ‘i’.

Sabiendo esto, vamos a un caso práctico:

Utilizando Joomla 1.5 con el editor JCE, nos podemos encontrar con el siguiente error:

«Deprecated: Function eregi() is deprecated in XXX\plugins\editors\jce\libraries\classes\editor.php on line 236»

En este caso, solo tenemos que ir a la línea en cuestión, y cambiar el código:

if( eregi( $key, $param ) ){

Por

if( preg_match( '/'.$key.'/i', $param ) ){

Esperamos que os sea de ayuda.

Depurar código en Joomla con FirePHP

programacion

Hay muchas formas de depurar código en PHP. Lo más habitual y rápido es usar ‘echo’ y ‘var_dump’ a cascoporro y listo. Pero si queremos algo un poco más profesional, firePHP es una excelente opción.

FirePHP es una extensión de la ya conocida extensión FireBug de FireFox.

Con esta herramienta, e incluyendo una pequeña librería en nuestro proyecto, podemos simplemente poner “fb($variable);” y en la consola de nuestro firebug nos aparecerá como un var_dump mejorado de la estructura y contenido de esa variable.

Así no ensuciamos la salida estándar de nuestro proyecto. xD

firephp en un item de K2

Si usamos Joomla, incluir la librería es mucho más fácil gracias a la extensión “J FirePHP”.

Solo tenemos que instalar y habilitar el plugin y listo. Ya podemos usar la función ‘fb’ en cualquier parte del código.

Además, el plugin permite también hacer un control de excepciones mediante firePHP y algunas otras opciones avanzadas en las que no vamos a entrar.

Tenéis toda la información en los enlaces.

NOTAS:

* 16/08/2011: A veces FirePHP no funciona con algunas versiones de firefox (como la 6) en combinación con algunas versiones de firebug. Es mas, tener instaladas algunas versiones de firebug y firephp en firefox 6 hace que firebug «desaparezca» y también otros complementos (como xmarks). Para solucionarlo reinstale la version 5 de firefox y las versiones de firebug 1.8.1 y de firephp 0.6.1.

* 16/08/2011: Si instalas el plugin y ves que no te muestra nada en consola comprueba que la opción del plugin Limit functionality to Joomla debug mode esta deshabilitada o bien habilita la depuración de joomla desde la configuración global.

Problemas en la salida cuando usamos include en php

PHP

Para volverse loco!
Resulta que realizando un código en php muy sencillo, veía que el código generado no se visualizaba correctamente.
Se creaban unos espacios extraños, y viendo el código fuente de forma normal y viéndolo con el Firebug, veía que no se correspondía.

El código fuente parecía estar bien, pero en el firebug las cosas me salían de una forma muy extraña, por ejemplo, algunas referencias a css y js del head, me las ponía debajo de body.

Un auténtico misterio.

A base de ir comentando a trozos el código para detectar donde estaba el problema, me di cuenta de que el error estaba cuando utilizaba la función ‘include’.

Después de utilizar include, include_once, require, require_once, con comillas dobles, con comillas simples, con paréntesis… al final, leyendo los comentarios del include de php.net, vi que un usuario comentaba que había un ‘security flaw’ y que para solucionarlo, usaba los métodos ‘ob_start()’ y ‘ob_end_clean()’ antes y después de hacer los includes.

Con la mayor parte del código comentado, al poner estas funciones, el problema parecía haberse solucionado… pero en cuanto descomenté el resto… otra vez la cosa estaba mal.

Después de muchas pruebas, frustraciones, y búsquedas en google, di con esta página: http://bugs.php.net/bug.php?id=40072

Ahí estaba la solución! El puto BOM del utf-8!! (con perdón)

Había probado el tema de la codificación de los archivos, pero no se me había ocurrido usar la codificación “utf-8 sin BOM”.

Lo peor de todo, es que entonces recordé… que esto ya me había pasado antes!!

Ayyyy… que malo es el Alzeimer…

Pues nada.
Espero que si algún día os pasa algo así, encontréis este post y os ayude a resolver rápidamente el problema.

Recordar que en notepad++ en español tenemos las opciones “utf-8” y “utf-8 sin BOM” pero que en otros editores o versiones podemos encontrarnos con “utf-8” y “utf-8 with signature”. En este último caso, habría que utilizar el “utf-8”.

Para los que tengáis la curiosidad de saber que es el BOM, que sepáis que es el ‘Byte Order Mark’ y podéis leer más en la wikipedia.