Tiempo estimado de lectura:

Esta pasada Semana Santa, como cada año que Apple publica una versión nueva de su sistema operativo, he realizado una instalación limpia de OS X Mavericks.

Además de trabajar en lenguaje Python (entre otros) durante el desarrollo de Doofinder, trabajo con distintas versiones de PHP para desarrollar algunos de los plugins oficiales que permiten integrar Doofinder en los principales sistemas de comercio electrónico (el último de los cuales ha sido el de integración con WooCommerce).

Configurando Homebrew

Como ya habrás deducido después de unas cuantas publicaciones, he adoptado Homebrew como gestor de paquetes en Mac en sustitución de MacPorts. Gracias a eso, desde hace ya tiempo gozo de una mayor flexibilidad, ya que me permite configurar a mi gusto ciertos programas gracias a su sistema de Fórmulas.

Así que si no tienes instalado Homebrew, no sé a qué esperas:

$ ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"

También necesitarás tener instalado XCode y las herramientas de desarrollo en línea de comandos, pero eso es otro tema que no voy a tratar aquí.

Si ya tienes instalado Homebrew, lo primero que tienes que hacer es actualizar la lista de fórmulas. De los dos comandos que vienen a continuación, ojito con el segundo. Si tienes alguna aplicación que no quieres que se actualice y que no has fijado en una versión concreta, se actualizará si lo ejecutas.

$ brew update
$ brew upgrade

Instalando PHP

Una vez hecho esto, necesitamos tener acceso a los repositorios de aplicaciones duplicadas (las que ya vienen en el sistema pero necesitamos añadir para cumplir ciertas dependencias de otras aplicaciones), versiones de aplicaciones existentes en el repositorio principal, y al repositorio en el que se mantienen las diferentes versiones de PHP para Homebrew. Es decir, trabaja:

$ brew tap homebrew/dupes
$ brew tap homebrew/versions
$ brew tap homebrew/homebrew-php

Si estáis en OS X Mavericks tal vez necesitéis hacer lo siguiente para que todo compile de forma apropiada:

$ cd /Applications/Xcode.app/Contents/Developer/Toolchains
$ sudo ln -s XcodeDefault.xctoolchain OSX10.9.xctoolchain

Ahora pongámonos manos a la obra con PHP:

$ brew install php53 --with-fpm --with-gmp
$ brew install php53-intl
$ brew unlink php53

$ brew install php54 --with-fpm --with-gmp
$ brew install php54-intl
$ brew unlink php54

$ brew install php55 --with-fpm --with-gmp
$ brew install php55-intl
$ brew unlink php55

El motivo de ejecutar el comando brew unlink es que por defecto usaremos la versión de PHP incluida en el sistema operativo, pero cuando vayamos a programar, activaremos la que nos convenga.

Seleccionando versiones concretas de PHP

Por si no te has enterado, hemos instalado las versiones FastCGI de PHP. Esto quiere decir que cualquiera de estas versiones de PHP, una vez activadas, estará corriendo un servicio local en el puerto 9000 de tu ordenador.

Al instalar cualquiera de las versiones de PHP te habrás percatado de que Homebrew nos ha ofrecido la posibilidad de cargar PHP en el arranque como un servicio permanentemente habilitado.

En mi caso no me interesa, pero si quiero hacer uso de los ficheros de preferencias *.plist que se instalan junto con PHP para cargar el servicio que me interese en cada momento.

La solución pasa por definir funciones en tu fichero .bash_profile, de modo que en cada nuevo terminal que abras estén disponibles como si fuesen comandos del sistema.

Esto es lo que he añadido:

# PHP version switcher
function php.stop {
    launchctl unload -w $(brew --prefix php53)/homebrew.mxcl.php53.plist 2>/dev/null
    launchctl unload -w $(brew --prefix php54)/homebrew.mxcl.php54.plist 2>/dev/null
    launchctl unload -w $(brew --prefix php55)/homebrew.mxcl.php55.plist 2>/dev/null
    brew unlink php53
    brew unlink php54
    brew unlink php55
}

function php.use {
    php.stop
    brew link php$1
    launchctl load -w $(brew --prefix php$1)/homebrew.mxcl.php$1.plist
}

alias php.check="lsof -Pni4 | grep LISTEN | grep php"`

De este modo, para activar la versión 5.4 de PHP puedo ejecutar:

$ php.use 54

Y cuando termine de utilizar PHP sencillamente ejecutaré:

$ php.stop

El último alias que he añadido sirve para comprobar que el servicio FastCGI está corriendo para algún PHP:

$ php.check

NGINX

Continuemos ahora con NGINX. La instalación, en mi caso, fue muy difícil:

$ brew install nginx

Para configurarlo solamente tuve que añadir lo siguiente al fichero /usr/local/etc/nginx/nginx.conf, dentro del bloque http:

1 http {
2     # ...
3     upstream php {
4         server 127.0.0.1:9000;
5     }
6     include  sites-enabled/*.site;
7     # ...
8 }

Esto lo que hace es definir que PHP se ejecuta como FastCGI en el puerto 9000 y que me cargue los hosts virtuales definidos en ficheros con extensión .site y localizados en /usr/local/etc/nginx/sites-enabled. Esto me permite activar y desactivar hosts mediante enlaces simbólicos dentro de ese directorio siguiendo el patrón establecido por Apache hace ya muchos años.

Ejemplo de host virtual

 1 server {
 2     listen 80;
 3     server_name woocommerce.127.0.0.1.xip.io;
 4     root /path/to/woocommerce;
 5     index index.php;
 6 
 7     client_max_body_size 26M;
 8 
 9     location = /favicon.ico {
10         log_not_found off;
11         access_log off;
12     }
13 
14     location = /robots.txt {
15         allow all;
16         log_not_found off;
17         access_log off;
18     }
19 
20     location / {
21         try_files $uri $uri/ /index.php?$args;
22     }
23 
24     location ~ \.php$ {
25         include fastcgi.conf;
26         fastcgi_intercept_errors on;
27         fastcgi_pass php;
28     }
29 
30     location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
31         expires max;
32         log_not_found off;
33     }
34 }

Este es un ejemplo de un host virtual para una aplicación WordPress.

Lo más interesante es este bloque:

1 location ~ \.php$ {
2     include fastcgi.conf;
3     fastcgi_intercept_errors on;
4     fastcgi_pass php;
5 }

Aquí decimos que los ficheros PHP se tienen que pasar al servicio PHP que hemos definido por FastCGI y con los parámetros que los señores de NGINX han puesto a nuestra disposición en el fichero /usr/local/etc/nginx/fastcgi.conf.

El resto de problemas que os puedan surgir os los dejo como ejercicio para casa :-P

Blog Logo

Carlos Escribano

Desarrollador Web desde hace 10 años. Me gusta resolver problemas de forma ingeniosa. Saber más.

Artículos de desarrollo web en español

nettoys.es

Volver al Inicio