Usar el cliente de Oracle con PHP 7.2 en Ubuntu 18.04 LTS

oracle php

Hay funciones predefinidas para ejecutar consultas a una base de datos de Oracle en PHP, sin embargo, hay que instalar el SDK y el cliente para poder usarlas. Va una guía de cómo hacer funcionar la combinación en un Ubuntu Server 18.04 LTS, probablemente sirva para otras distribuciones.

Descargamos el cliente de Oracle de la página oficial, en este caso es:

Instant Client for Linux x86-64, la última versión (la 12.2.0.1.0):

- instantclient-basic-linux.x64-12.2.0.1.0.zip
- instantclient-sdk-linux.x64-12.2.0.1.0.zip

Una vez descargados los subimos a nuestro servidor, en este caso los dejaré en /tmp, luego:

apt install unzip
cd /tmp/
unzip instantclient-basic-linux.x64-12.2.0.1.0.zip
unzip instantclient-sdk-linux.x64-12.2.0.1.0.zip
sudo mv instantclient_12_2 /usr/local/lib/

Una vez que hemos movido los archivos, preparamos algunas variables de entorno:

# creamos o editamos el archivo /etc/environment y añadimos:
# Oracle Instant Client
LD_LIBRARY_PATH="/usr/local/lib/instantclient_12_2"
ORACLE_BASE="/usr/local/lib/instantclient_12_2"
TNS_ADMIN="/usr/local/lib/instantclient_12_2"
ORACLE_HOME="/usr/local/lib/instantclient_12_2"

# por último, cargamos las variables:
source /etc/environment
# comprobamos que esté bien:
echo $ORACLE_HOME
# lo anterior nos debe dar de resultado en consola: /usr/local/lib/instantclient_12_2
# Luego, vamos a crear un enlace simbólico de un archivo que ahí viene:
cd $ORACLE_HOME
sudo ln -s libclntsh.so.12.1 libclntsh.so # así viene

Ahora si vamos a compilar el módulo oci8.so con pecl:

# instalamos pear (pecl) y php dev, luego oci8
apt install php-pear php7.2-dev
pecl install oci8
# Cuando nos pregunte la localización del SDK y Oracle, escribimos: 
### instantclient,/usr/local/lib/instantclient_12_2
#
# Si todo salió bien, al final dirá un mensaje:
# Build process completed successfully
# Installing '/usr/lib/php/20170718/oci8.so'
# install ok: channel://pecl.php.net/oci8-2.1.8
# configuration option "php_ini" is not set to php.ini location
# You should add "extension=oci8.so" to php.ini

Ahora, debemos crear la configuración para que PHP la cargue:

echo "extension=oci8.so" | tee /etc/php/7.2/mods-available/oracle.ini
# listo, ahora si queremos añadirlo a PHP-FPM:
cd /etc/php/7.2/fpm/conf.d && ln -s /etc/php/7.2/mods-available/oracle.ini ./20-oracle.ini
# en línea de comandos:
cd /etc/php/7.2/cli/conf.d && ln -s /etc/php/7.2/mods-available/oracle.ini ./20-oracle.ini
# este paso es importante: añadimos la biblioteca del cliente de oracle a ldconfig:
echo $ORACLE_HOME | tee /etc/ld.so.conf.d/oracle.conf
ldconfig -v

Reiniciamos php-fpm y listo, ya tenemos disponibles las funciones, bastaría para comprobar, en línea de comandos:

$ php -i | grep -i oracle
# lo anterior, daría una salida como:
/etc/php/7.2/cli/conf.d/20-oracle.ini,
Oracle Run-time Client Library Version => 12.2.0.1.0
Oracle Compile-time Instant Client Version => 12.2

Ahora pues ya sólo probar con un script de ejemplo:

<?php
   # conectar a servidor ORACLE @toro https://tar.mx
   $SERVER = "127.0.0.1";
   $PORT = 1521;
   $SERVICE= "NOMBRE_SERVICIO_ORACLE";
   $DB_OCI = sprintf('(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = %s)(PORT = %d)))
             (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = %s)
             (FAILOVER_MODE = (TYPE = SELECT) (METHOD = BASIC) (RETRIES = 180) (DELAY = 5))))',$SERVER,$PORT,$SERVICE);
   $ora = oci_connect("USUARIO", "CONTRASEÑA", $DB_OCI,'AL32UTF8');
   if(!$ora) die("No se puede conectar al servidor\n");
   //todo ok, debería decir algo como: Resource id #NUMERO
   print_r($ora);

Puedes entonces empezar a hacer tus consultas a la DB de Oracle desde PHP :-)

En caso de que no se ejecute ldconfig con la configuración del lugar donde están ubicadas las bibliotecas, lanzará un error muy feo como el que sigue:

PHP Warning: PHP Startup: Unable to load dynamic library 'oci8.so' (tried: /usr/lib/php/20170718/oci8.so (libmql1.so: cannot open shared object file: No such file or directory), /usr/lib/php/20170718/oci8.so.so (/usr/lib/php/20170718/oci8.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0

Aquí puedes ver las fotos del post

Almacenado en PHP, Linux, Oracle

por Jorge Martínez Mauricio :)



¿Algo que comentar?


Suscríbete por correo electrónico, recibirás los nuevos escritos antes que nadie y es gratis 😊

¿Ya conoces los foros de tar?

Relacionadas

    tar.mx es un blog sobre tecnología y otras chunches