SetLocale en PHP

Hace poco tuve un problema con el setlocale en PHP. Tengo instalado un plugin, hecho por mi, en una instalación de WordPress que tengo en mi ordenador, con un servidor local.

El plugin funcionaba en local a las mil maravillas, ya que con el setlocale de php cambiaba los idiomas de acuerdo a la selección de idioma del usuario:

setlocale(LC_ALL, $code_locale);

Donde $code_locale lo saco de la información del lenguage seleccionado por el usuario de otro plugin, WPML, del que ya comenté algo el otro día.

El caso es que al subir mi plugin al servidor de producción, no se mostraban bien los días de la semana. De hecho siempre se mostraban en inglés. Haciendo un poco de debugging con echos comprobé que, haciendo una llamada a setlocale con el segundo parámetro a 0:

$code_locale = setlocale(LC_ALL, 0);

el $code_locale que me estaba devolviendo era una simple “C” y no algo como “es_ES” que es lo que me esperaba.

Leyendo un poco por el manual de setlocale en inglés, me enteré de que el sistema estaba en POSIX (supongo que tendrá que ver que el servidor sea un Linux) y por eso PHP me devolvía una “C”.

Un poco más de investigación me llevó a la conclusión de que con ponerle “.UTF8” después del código del lenguage que quería sería suficiente, con lo que quedaría por ejemplo para francés:

setlocale(‘fr_FR.UTF8’);

y aquí la función que he acabado usando:

Resumen de Symfony Live 2010

Iba a hacer un buen resumen pero se me han adelantado, así es que dejo el link y paso a dejar mis opiniones.

Resumen de la conferencia Symfony Live 2010 en Symfony.es

+

Me ha gustado mucho la primera parte, donde Fabien Potencier ha repasado las novedades (CssSelector, DomCrawler, Browser, Finder), donde ha ido poniendo ejemplos de código donde se veía la simplicidad en el uso de los mismos.

También me ha gustado el tema de los Bundles, se ve muy limpio el tema y muy bien pensado.

Me ha llamado la atención el amplio desarrollo que está haciendo la gente de Doctrine para soportar Mongo y todo el tema de NoSQL. Igual habría que llevar la base de datos por esos derroteros.

Impresionantes los Benchmarks que ha sacado Fabien en la última parte de la conferencia, donde pone a Symfony 2 muy por encima de Symfony en cuanto a peticiones por segundo. De hecho, es tan estable que cuantos más usuarios hacen peticiones al mismo tiempo, mejor es Symfony 2 respecto a Symfony.

No me ha gustado que no se proporcionen las trasparencias una vez ha terminado la conferencia. Tendríamos que poder echarle un segundo vistazo a todo lo que se ve en cada presentación. Igual estoy pecando de vago y no he buscado lo suficiente, pero me da que no hay nada por la red.

Las preguntas que podían hacerse después de cada presentación eran muy escasas, ya que en mi horario éramos 130 personas conectadas y, al finalizar la presentación, todo el mundo preguntaba a la vez, con lo que el tiempo de preguntas y respuestas era, en mi opinión, muy corto. Yo creo que deberían haber grabado esas preguntas y haber hecho una entrada en un blog contestándolas o algo así.

De todas formas, la conferencia ha estado muy bien y se queda uno deseando que saquen ya la versión alfa allá por septiembre. De momento el Jueves han dicho que subirán un nuevo sandbox con lo último que tienen, pero de documentación y tal ni hablamos hasta que salga una versión oficial.

Operaciones via ftp en php

Un gran problema de trabajar con servidores compartidos es que te capan un montón de cosas. Entre ellas la grabación de ficheros subidos desde un formulario via web. Nunca he entendido esto, supongo que será para cubrirse las espaldas y no tener problemas si algún desalmado se hace con tu usuario y trastea en tu cuenta.

Por un lado me parece bien, pero para la gente que se tiene que dejar los cuernos en buscar alternativas a la subida normal de archivos me parece una guarrada.

En fin, el caso es que encontré que para cualquier operación en el servidor que implique permisos de administración (crear un fichero, crear un directorio, cambiar permisos, etc…) normalmente el usuario destinado a las operaciones de ftp suele tener dichos permisos con lo que simplemente con abrir una conexión con el usuario de ftp nos servirá.

Por ejemplo, para crear un directorio se haría de esta forma. (Notese que yo tengo los datos del usuario ftp en un fichero aparte con defines con lo que uso las variables _FTP_X para iniciar la conexión con el servidor)

static public function mkdir_ftp($path,$mod)
{
$path = _FTP_ROOT_.$path;

$ftp_user_name = _FTP_LOGIN_;
$ftp_user_pass = _FTP_PASS_;
$ftp_root = _FTP_ROOT_;
$ftp_server = _FTP_SERVER_;

// conexión básica
$conn_id = ftp_connect($ftp_server);

// login con nombre de usuario y password
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
$success=false;
// intentamos crear el directorio $path
if (ftp_mkdir($conn_id, $path)) $success=true;

//Cerramos la conexión
ftp_close($conn_id);

return $success;
}

Escuchando el Mixtape de Kayo

Xdebug en MAMP

Loco! Me he vuelto loco para conseguir que funcionara el xdebug en el MAMP para hacer debugging de mi código php en Netbeans. Llevaba tiempo queriendolo instalar pero ni por asomo me habría imaginado que me iba a costar tanto.

Siguiendo las instrucciones de la página de netbeans que explica como instalar xdebug al hacer phpize para compilar el xdebug que genera el archivo xdebug.so siempre me daba el mismo error:

Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF
environment variable is set correctly and then rerun this script.

Buscando como alma que lleva al diablo, todas las páginas que encontraba me armaban un cacao de cojones. Hasta me hice una cuenta developer en .mac para descargarme XCode Tools por si fuera eso (lo pone como sugerencia por si no te funciona el make).

En fin, no me entretengo, al final ha sido tan facil como descargarse un xdebug.so ya compilado y utilizarlo en otra carpeta a la que dice el tutorial (osea, nada de lo que dice…).

Despues de mucho buscar llegué a esta página donde había una explicación detallada de como hacer que funcionara xdebug (pero sin suerte para mí como en las anteriores 107). Gracias a San Dios había un enlace a los Komodo Debugger Extensions, que tiene enlaces a la ultima version de xdebug compilada.

Aleluya!! Ya tenía el dichoso archivo sin tener que compilar, saltandome unos cuantos pasos del tutorial. Descargué la última versión para Mac Osx de PHP Remote Debugging de la sección Komodo 5.1 Remote Debugging Packages. Descomprimí ese y había varias carpetas. Cogí el de la versión 5.2 porque rebuscando por google buscando Komodo, encontré esta página donde explica como instalar xdebug en Leopard, es decir lo mismo que estoy explicando yo, menos de donde sacar el xdebug.so compilado.

Una cosa importante es deshabilitar el PHP Zend Optimizer que trae por defecto acivadoel MAMP, así es que desde la ventana de MAMP ya estas tardando en desactivarlo.

En fin, puse el archivo xdebug.so en el directorio “/Applications/MAMP/bin/php5/xdebug” y al final del fichero de configuración de php5 en MAMP “/Applications/MAMP/conf/php5? puse lo siguiente:

; xdebug config for Linux and Mac OS X
zend_extension=/Applications/MAMP/bin/php5/xdebug/xdebug.so
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.idekey=jeffg
xdebug.profiler_enable=1
xdebug.profiler_output_name=xdebug.cachegrind-out.%s.%p

En la entrada “remote_port” es muy importante poner el mismo puerto que está configurado en NetBeans para poder hacer debugging desde el propio IDE. Este se puede cambiar desde las preferencias de NetBeans en la sección PHP, por defecto está a 9000 y para que nos vamos a complicar, yo lo dejé igual.

Una vez hecho esto y habiendo reiniciado MAMP, haciendo un phpinfo() podremos saber si xdebug está bien instalado. Si lo está nos saldrá una linea como esta:

This program makes use of the Zend Scripting Language Engine:
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
with Xdebug v2.0.4, Copyright (c) 2002-2008, by Derick Rethans

Cuando se empiece a hacer debugging desde NetBeans en la parte inferior derecha debe aparecer netbeans-xdebug [ running ]. Si aparece algo como netbeans-xdebug [ waiting ] o algo parecido, revisalo todo porque algo tienes mal, seguramente algo en el php.ini está mal escrito.

Espero que ayude a alguien…