viernes, 7 de enero de 2011

Instalar Extension PDO_OCI en Suse Linux

En los siguientes pasos instalaremos el módulo php_pdo_oci en una maquina SLES 11 de 64 bits, que tiene instalado el instant client 11.2 Dicha máquina ya tenía instalado varias elementos necesarios para que este módulo funcione.

Sobre la instalación del instant client de Oracle, y el módulo oci8 hay más información en el siguiente post:

- Instalación del Oracle Instant Client y configuración de Oci8 en php y apache en Suse


Nos centraremos exclusivamente en la instalación del PDO_OCI, ejecutaremos los siguientes pasos como root:

1- Obtener extensión y descomprimir
wget http://pecl.php.net/get/PDO_OCI
tar zxvf PDO_OCI
cd PDO_OCI-1.0/
phpize

2- Fijar el directorio del home de oracle ( en el caso de que no esté definido)
export ORACLE_HOME=/usr/lib/oracle/11.2/client64

3-Creamos unos enlaces (el configure da problemas si no están) para la versión de 64 bits

ln -s /usr/lib/oracle/11.2/client64 /usr/lib/oracle/11.2/client
ln -s /usr/include/oracle/11.2/client64 /usr/lib/oracle/11.2/client/include
4-Parcheamos para la versión 11.2 los archivos añadiendo en secciones similares las siguientes líneas (el número de linea es orientativo). De forma alternativa podemos sustituir la cadena de texto 10.2 por 11.2 Esto soluciona el error :
Configure: error: Unsupported Oracle version! 11.2

Archivo config.m4:
Línea 10
elif test -f $PDO_OCI_DIR/lib/libclntsh.$SHLIB_SUFFIX_NAME.11.2; then
PDO_OCI_VERSION=11.2

Línea 125
11.2)
PHP_ADD_LIBRARY(clntsh, 1, PDO_OCI_SHARED_LIBADD)
;;

Archivo configure:
Línea 5492:
11.2)


case clntsh in
c|c_r|pthread*) ;;
*)
if test "$ext_shared" = "yes"; then
PDO_OCI_SHARED_LIBADD="$PDO_OCI_SHARED_LIBADD -lclntsh"
else


case clntsh in
c|c_r|pthread*) ;;
*)
LIBS="$LIBS -lclntsh"
;;
esac


fi
;;
esac


;;

5- Para Solucionar el errores:
Cannot find php_pdo_driver.h
Ejecutaremos lo siguiente:
mkdir include
ln -s /usr/include/php5/ include/php
Para el error
pdo_oci.c:34:1: error: unknown type name 'function_entry'
Editamos el archivo pdo_oci.c y cambiamos el function_entry por zend_function_entry


6- Ejecutamos el configure, compilamos e instalamos ( no debería salir mensaje de error)
./configure --with-pdo-oci=instantclient,/usr,11.2
make && make install
7- Añadimos el módulo a php
echo extension=pdo_oci.so > /etc/php5/conf.d/pdo_oci.ini
8- Reiniciamos apache
rcapache2 restart

9- Verificamos que se ha cargado correctamente con alguno de los siguientes comandos para listar los módulos cargados:
php -m | grep -i PDO
php -r "phpinfo();" | grep -i PDO_OCI
o directamente un phpinfo desde el navegador:

4 comentarios:

Angelorum dijo...

mUCHISMAS , pero muchisimas gracias!! en serio, llevo horas tratando de configurar esta porquería de oracle para que trabaje con PHP. Y ahora me resultó.

Eso si, tengo una pequeña duda:
en mi phpinfo(); en la seccion de PDO_OCI, solo me aparece el encabezado de la tabla que dice:
PDO Driver for OCI 8 and later enabled

Mientras que en otros pdo, me sale por lo menos una fila con datos, como en:

pdo_mysql
PDO Driver for MySQL enabled
Client API version mysqlnd 5.0.7-dev - 091210 - $Revision: 304625 $

Es esto normal en el pdo_oci?

Nuevamente muchas, gracias y saludos :)

Angelorum dijo...

Excelente, muchas gracias, es el mejor que he encontrado despues de tres o mas horas de buscar y de instalar y desinstalar. Muchas gracias :) !

Diego dijo...

Sí, es correcto, debe salirte únicamente:

PDO_OCI
PDO Driver for OCI 8 and later enabled

Orlando Garcia Monroy dijo...

Muchas gracias por su aporte. Excelente explicación me funciono perfecto!!!