Delirios de un Informático

Instalar Phalcon en el PHP “nativo” de Mac OS X

Phalcon es un excelente framework para PHP con la particularidad de estar programado en C como una extensión del lenguaje. Ha evolucionado muchísimo y se ha convertido, en mi opinión, en uno de los frameworks más completos e interesantes después de Laravel.

La instalación en Mac puede realizarse con Homebrew pero realiza la instalación de una versión de PHP aparte de la versión nativa de Mac OS X. Si queremos compilar la extensión de Phalcon sin más dependencias, los pasos a seguir difieren un poco de las instrucciones oficiales:

brew install gettext
brew link --force gettext
git clone https://github.com/phalcon/cphalcon
cd cphalcon/build/64bits
git checkout 1.3.4
phpize
./configure --enable-phalcon
make
sudo cp modules/phalcon.so /usr/lib/php/extensions/no-debug-non-zts-20121212

Siguiendo las instrucciones de la web oficial, nos encontramos con dos problemas: el primero es que no localiza el archivo libintl.h (de ahí el uso de Homebrew para instalar GetText) y el segundo es un fallo con _libintl_setlocale en ciertas versiones, que provoca el siguiente error:

dyld: lazy symbol binding failed: Symbol not found: _libintl_setlocale
  Referenced from: /usr/lib/php/extensions/no-debug-non-zts-20100525/phalcon.so
  Expected in: flat namespace

dyld: Symbol not found: _libintl_setlocale
  Referenced from: /usr/lib/php/extensions/no-debug-non-zts-20100525/phalcon.so
  Expected in: flat namespace

Este error se evita haciendo el checkout a la última versión publicada.

Cómo instalar extensiones PHP en Mac OS X

Además de poder utilizar PECL es posible compilar e instalar cualquier extensión de PHP en Mac OS X. Resulta útil si es necesario que los parámetros de ./configure sean diferentes de los que se usan por defecto o si se necesita instalar una extensión que no tenga Mac de serie.

Los únicos requisitos son disponer de Xcode y descargar la versión exacta que esté instalada en Mac (la 5.3.6 en Lion). Luego, el proceso es sencillo (tomaré como ejemplo la extensión pdo_odbc):

wget http://es2.php.net/get/php-5.3.6.tar.gz/from/es.php.net/mirror
tar xzvf php-5.3.6.tar.gz && cd php-5.3.6/ext/pdo_odbc
phpize
./configure --with-pdo-odbc=iODBC
make
sudo cp modules/pdo_odbc.so /usr/lib/php/extensions/no-debug-non-zts-20060613/

Luego basta añadir la correspondiente línea al php.ini y reiniciar el servidor web :).

Cómo conectar PHP a SQL Server en Mac OS X

Siguiendo con mi serie de anotaciones sobre el desarrollo con PHP en Mac OS X, hoy toca hablar de algo que es más sencillo de lo que parece a primera vista: conectar PHP con SQL Server (virtualizado en una máquina Windows Server 2003 en mi caso) utilizando iODBC en Mac OS X Lion.

Con la versión de PHP que trae Lion de serie viene incluído el soporte para iODBC (una implementación de código abierto de ODBC y alternativa a unixODBC), al que le basta un controlador compatible para acceder a cualquier servidor de bases de datos. En este caso se recurre a FreeTDS, la implementeación de código abierto del controlador para SQL Server.

Como para muchas otras aplicaciones que se necesitan compilar en Mac OS X, he recurrido a Homebrew, que tras instalarlo sólo hay que ejecutar lo siguiente:

brew install freetds

La configuración también resulta sencilla: el archivo /usr/local/etc/freetds.conf debe contener lo siguiente al final:

[sqlserver]
	host = ip_o_host_del_servidor
	port = 1433
	tds version = 7.1

Luego, hay que crear el archivo /etc/odbcinst.ini con el siguiente contenido:

[FreeTDS]
Description = FreeTDS
Driver = /usr/local/lib/libtdsodbc.so
Setup = /usr/local/lib/libtdsodbc.so
UsageCount = 1

Por último, debe definirse el DSN creando el archivo /etc/odbc.ini:

[ejemplo]
Driver = FreeTDS
Database = ejemplo
Description = Base de datos de ejemplo
ServerName = sqlserver

Tras estos pasos, PHP debería poder conectarse al servidor SQL Server sin ningún problema. Pueden usarse las funciones ODBC de PHP para realizar la conexión:

$db = odbc_connect('ejemplo', 'usuario', 'contraseña');
$result = odbc_exec($db, "SELECT campo1, campo2 FROM tabla");
while($row = odbc_fetch_object($result)) var_dump($row);
odbc_close($db);

Si existe cualquier problema con la conexión, puede instalarse unixODBC con Homebrew (brew install unixodbc) y testear la conexión y obtener mensajes de error con el siguiente comando:

tsql -S ip_o_host_del_servidor -U sa

Por último es importante no añadir espacios o tabulaciones en los archivos .ini o iODBC no podrá obtener correctamente los valores causando un error en la conexión.

Instalar PEAR/PECL en el PHP “nativo” de Mac OS X

Siguiendo mi serie de artículos de desarrollo web en Mac OS X, hoy explicaré cómo instalar PEAR+PECL para su uso con el PHP que Mac OS X trae de serie y así disponer de la gran cantidad de extensiones de PECL, como XDebug o Memcache.

En Mac OS X 10.4 PEAR venía incluído en la distribución de PHP, pero en versiones 10.5 y superiores es necesario descargarlo e instalarlo partiendo del instalador oficial:

curl http://pear.php.net/go-pear.phar > go-pear.phar
php -d detect_unicode=0 go-pear.phar

Mi recomendación es instalarlo en /usr/local/pear. Una vez instalado, hay que cambiar la ruta de inclusión en /private/etc/php.ini por include_path = ".:/usr/local/pear/share/pear".

Ahora, sólo queda instalar las librerías o extensiones de la forma tradicional, pero teniendo Xcode instalado para poder realizar la compilación de las extensiones. En mi caso, XDebug es imprescindible:

sudo /usr/local/pear/bin/pecl install xdebug

Por último, sólo hay cargar la extensión desde /private/etc/php.ini y reiniciar Apache :).

Apache, PHP y MySQL en Mac OS X

Estos días he necesitado montar la misma configuración de servidor web para desarrollo que tengo en Linux, por lo que al principio tiré de lo más fácil: xampp y MAMP, pero el que instale los binarios y archivos de configuración en rutas poco cómodas, el tener que arrancarlos cada vez que inicio la sesión (pidiendo contraseña además) y otros detalles acabaron por cansarme. Así que investigando un poco me topé con que Leopard y Snow Leopard incluyen de serie el servidor Apache con PHP, ubicado en rutas razonables y activable como un servicio. Para activarlo al inicio es necesario activar la opción Compartir Web en el panel Compartir de las Preferencias del Sistema. Luego, puede configurarse editando el archivo /etc/apache2/httpd.conf. Mis cambios son los siguientes:

  • Cambiar User por mi nombre de usuario y Group por staff para no tener problemas con los permisos de los archivos sobre los que se trabaja
  • DocumentRoot por /Users/miusuario/Sites así como el <Directory> que está a continuación para acceder de forma cómoda al directorio base
  • Activar PHP descomentando la línea LoadModule php5_module libexec/apache2/libphp5.so
  • Cambiar los AllowOverride a All para poder hacer uso de archivos .htaccess y demás

Con estos cambios, el servidor web estará disponible siempre que se inicie sesión y puede controlarse con sudo apachectl. La configuración personalizada de PHP puede activarse creando el archivo /etc/php.ini (copiando directamente /etc/php.ini.sample y es necesario definir el valor de la zona horaria con date.timezone = "Europe/Madrid".

Por otro lado, para instalar MySQL (que no viene de serie) he recurrido a Homebrew para instalar MySQL. La instalación es sencilla, empezando por Homebrew:

ruby -e "$(curl -fsSLk https://gist.github.com/raw/323731/install_homebrew.rb)"
brew install git
brew update

Una vez instalado Homebrew, se instala MySQL:

brew install mysql
cp /usr/local/Cellar/mysql/5.1.52/com.mysql.mysqld.plist ~/Library/LaunchAgents
launchctl load -w ~/Library/LaunchAgents/com.mysql.mysqld.plist
mysql_install_db

Una vez instalado MySQL (media hora para compilar en mi portátil, 5 minutos en el equipo de sobremesa), los binarios (mysql, mysqldump…) estarán accesibles como un comando más en el PATH y se iniciará automáticamente al inicio de cada sesión de usuario (los comandos 2 y 3 se encargan de eso).