Niano Niano
3Jun/092

Oracle y PHP5 (y van tres)

Recientemente me ha tocado reinstalar un servidor donde tenía que montar una aplicación que usa el cambalache que monté anteriormente con el módulo pdo_oci.

He podido descubrir que esta no es la manera más sencillo ni correcta de hacerlo. Resulta que desde Oracle nos dicen que nos olvidemos de pdo_oci y que usemos oci8. Recomiento la lectura de: Underground PHP and Oracle Manual

Pues bien, a ello me he lanzado y ha sido sorprendente la facilidad con la que se puede instalar el soporte de oracle si lo haces con el módulo oci8. Los pasos a seguir son los siguientes:

  1. Descargar las librerías "Basic" y "SDK" del Instant Client de Oracle. Esta vez podremos usar el último que hayan sacado. Yo lo he hecho con la versión 11.1 y funciona de maravilla. Podéis descargarlo todo aquí: http://www.oracle.com/technology/software/tech/oci/instantclient/index.html
  2. Crea el directorio /opt/oracle/instantclient, mueve los zips allí y descomprímelos. Creará un directorio /opt/oracle/instantclient/instantclient_11_1
  3. Instala, si no lo has hecho ya, los paquetes php-pear, php5-dev y build-essential
  4. Ejecuta "pecl install oci8" con privilegios de root (sudo o lo que más te apetezca)
  5. Te preguntará por la ruta a las librerías. Debes configurar la ruta para que apunte al directorio recién creado y pasarle algún parámetro más, por lo que deberías escribir "shared,instanclient,/opt/oracle/instantclient/instantclient_11_1" (sin las comillas, claro)
  6. Después de hacer sus cosillas, el instalador te habrá dejado en /usr/lib/php5/20060613+lfs un fichero llamado oci8.so. Ahora tienes que decirle a PHP5 que lo tenga en cuenta escribiendo al final de los ficheros "php.ini" que tengas la línea "extension=oci8.so". Los ficheros "php.ini" están en /etc/php5/cli y /etc/php5/apache

Solo tienes que tener una cosa más en cuenta: Asegúrate de que el usuario www-data puede acceder a la ruta /opt/oracle... porque si no, verás un mensaje de error como este:

PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php5/20060613+lfs/oci8.so' - libaio.so.1: cannot open shared object file: No such file or directory in Unknown on line 0

Además, si vas a ejecutar scripts con tu usuario de sistema, tu también tendrás que tener acceso al directorio.

Nada más :)

En el próximo post pondré como configurar Symfony para que utilice las funciones de oci8 en vez de las de pdo_oci.

Comparte este post:
  • Print
  • del.icio.us
  • Facebook
Etiquetado con: , , , 2 Comentarios
16Feb/094

Symfony 1.2 + Propel 1.3 + Oracle

Después de intentar poner el marcha la extensión de PHP5 de PDO_OCI durante dos días, hoy al fin lo he conseguido.

No hay apenas documentación y para más inri, la poca que hay mezcla versiones incompatibles entre si. Ha sido una auténtica aventura ponerlo en marcha.

La configuración del servidor es la siguiente:

  • Ubuntu Server 8.10 x86 sobre VMWare
  • PHP5 (la versión del repositorio de Ubuntu)

Parte 1: Instalar el driver OCI (oracle) de PDO

Antes de nada debes saber que vas a tener que instalar la extensión PDO y PDO_OCI a mano. Por un lado, la de PDO_OCI no tiene candidatos y si la compilas a mano, resulta que es incompatible con el API de PDO que te instala el repositorio de ubuntu, por lo que al final, la mejor solución es compilar a mano ambas, a partir del repositorio de fuentes de PEAR.

Para instalar PDO solo hay que hacer un "sudo pecl install pdo". Asegúrate de tener instalado el paquete php-pear y el php5-dev porque si no no podrás hacer esto.

Despues de hacerlo, habrás reemplazado la extensión PDO que te viene al hacer un "apt-get install php5" por el de PEAR.

Ahora viene la parte divertida: instalar en el sistema la extensión PDO_OCI. Para ello debes instalar dos cositas de nuestro gran amigo Oracle (http://www.oracle.com/technology/software/tech/oci/instantclient/index.html):

  • Oracle Instant Client (library)
  • Oracle Instant Client (SDK)

Lamentablemente, solo podrás utilizar las versiones inferiores a la 11 (de la 10.2.0.4 para abajo).

Luego descomprime la librería en /usr/lib/oracle/10.2.0.4/client/lib y el sdk en /usr/include/oracle/10.2.0.4/client

Luego dile al sistema que añada estas rutas con el comando ldconfig y corriges un par de nombres de ficheros:

sudo ldconfig /usr/lib/oracle/10.2.0.4/client/lib
sudo ldconfig /usr/include/oracle/10.2.0.4/client
sudo ln -s /usr/lib/oracle/10.2.0.4/client/lib/libclntsh.so.10.1 /usr/lib/oracle/10.2.0.4/client/lib/libclntsh.so
sudo ln -s /usr/lib/oracle/10.2.0.4/client/lib/libocci.so.10.1 /usr/lib/oracle/10.2.0.4/client/lib/libocci.so

Ahora vamos a descargar las fuentes de PDO_OCI, compilarlas e instalarlas en el sistema:

sudo mkdir /usr/src/pdo_oci
cd /usr/src/pdo_oci
sudo pecl download pdo_oci
sudo tar -zxvf PDO_OCI-1.0.tgz
cd PDO_OCI-1.0
sudo phpize5
sudo ./configure --prefix=/usr --with-pdo-oci=/usr/lib/oracle/10.2.0.4/client
* editar Makefile *
sudo make
sudo make install

Al editar Makefile debéis añadir la ruta a /usr/include/oracle/10.2.0.4/client/include en la directiva "INCLUDES"

Después de esto ya tendréis la extensión instalada en vuestro sistema. Sólo hay que editar /etc/php5/conf.d/pdo.ini y añadir:

extension=pdo_oci.so

Ale, a disfrutar! En el siguiente post explicaré como hacer que todo esto funcione con Propel 1.3 y Symfony, pero antes tengo que averiguar cómo coño se hace T_T.

Comparte este post:
  • Print
  • del.icio.us
  • Facebook