Concurrencia, bloqueo de código y semáforos en 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!

Editor de código “Sublime text”

Nos ha causado una muy grata impresión el editor de códigoSublime text” disponible para Linux, Windows, y Mac y queríamos presentároslo.

Simplemente os dejamos el enlace a la web.
El enlace a una revisión completa del programa (en inglés).
Y la lista de características (también en inglés):

  • Side by side multi-pane editing
  • Minimap: see your code from 10,000 feet
  • Full screen mode: use all your pixels, all the time
  • Nothing but text mode: the text, the whole text, and nothing but the text
  • Syntax highlighting for many languages with C, C++, C#, CSS, D, Erlang, HTML, Groovy, Haskell, HTML, Java, JavaScript, LaTeX, Lisp, Lua, Markdown, Matlab, OCaml, Perl, PHP, Python, R, Ruby, SQL, TCL, Textile and XML supported out of the box, and more available for download
  • Multiple color schemes, with several included, and many more available for download
  • Bracket highlighting
  • Auto save: never lose your changes, not even if the dog thinks power cords are tasty
  • Fully customizable key bindings, menus and toolbar
  • Rich key binding language including sequenced key bindings, regular expression key matches, contextual bindings and parameterized bindings
  • Python plugins with a rich API
  • Rich selection of editing commands, including indenting / unindenting, paragraph reformatting, line joining and much more
  • Multiple selections: Simplify many tasks that used to require macros or regular expression
  • Column select
  • Regular expression search and replace
  • Incremental find as you type
  • Preserve case on replace
  • Bookmarks: Makes navigating through long files a breeze
  • Spell check as you type
  • Bracket matching
  • Commenting and uncommenting blocks of text
  • Asynchronous file loading, so you’re never blocked when loading files off slow network drives
  • Macros
  • Snippets
  • Auto complete
  • Repeat last action
  • Build tool integration
  • Automatic build on save
  • WinSCP integration for editing remote files via SCP and FTP

Probadlo y a ver qué os parece!!
Saludos!

Creación de listas en Joomla con JHTML

En Joomla hay una forma bastante sencilla y cómoda de montar el html de unos radiobuttons o de un select.

$genderOptions[] = JHTML::_('select.option', 'm', JText::_('Male'));
$genderOptions[] = JHTML::_('select.option', 'f', JText::_('Female'));
$gender_list = JHTML::_('select.radiolist', $genderOptions, 'gender', '', 'value', 'text', $inseveUser->gender);

$viasOptions[] = JHTML::_('select.option', 'c', JText::_('Calle'));
$viasOptions[] = JHTML::_('select.option', 'a', JText::_('Avenida'));
$vias_list = JHTML::_('select.genericlist', $viasOptions, 'tipo_via', '', 'value', 'text', $inseveDireccion->tipo_via);

Además, para poder hacer optgroups en los selects, basta con añadir la opción:

$genderOptions[] = JHTML::_('select.optgroup', 'nombre');

y luego debajo añadir las opciones y por último llamando a select.genericlist.

Sustituir función eregi por preg_match

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

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.