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 servidorn"); //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 0https://panchito-kardashian.tar.mx/media/2018/07/oraclephp.jpg