miércoles, 6 de noviembre de 2013

Solución: Error driver oci8 en php Codigniter con Oracle

Durante el desarrollo de mi aplicación web no tuve inconvenientes en conectarme con mi base de datos en Oracle, claro que ya había instalado del controlador OCI e integrado con PHP en mi servidor de pruebas bajo Fedora 20.

Al intentar desplegar mi aplicación a nivel de producción en un servidor CentOS 6, había realizado los mismos pasos de instalación de OCI8 pero mi aplicación no se conectaba con la base de datos y me desplegaba el mensaje:

A Database Error Occurred
Unable to connect to your database server using the provided settings.
Filename: /home/helper/public_html/third_party/MX/Loader.php
Line Number: 102

Desactivé el debug de base de datos en application para que me muestre los errores con mas detalle en /application/config/database.php cambiando

$db['production']['db_debug'] = TRUE;

a

$db['production']['db_debug'] = FALSE;

Fue entonces donde obtuve los siguientes errores

A PHP Error was encountered

Severity: Warning
Message:  oci_parse() expects parameter 1 to be resource, boolean given
Filename: oci8/oci8_driver.php
Line Number: 186


A PHP Error was encountered

Severity: Warning
Message:  oci_set_prefetch() expects parameter 1 to be resource, null given
Filename: oci8/oci8_driver.php
Line Number: 171


A PHP Error was encountered

Severity: Warning
Message:  oci_fetch_assoc() expects parameter 1 to be resource, null given
Filename: oci8/oci8_result.php
Line Number: 153


A PHP Error was encountered

Severity: Warning
Message:  oci_fetch_assoc() expects parameter 1 to be resource, null given
Filename: oci8/oci8_result.php
Line Number: 153

Solución


El origen de estos errores estaba en el servidor Web Apache por lo siguiente: al reiniciar el servicio me salia el mensaje:

# service httpd restart

Parando httpd:                                             [  OK  ]
Iniciando httpd: httpd: apr_sockaddr_info_get() failed for WEBSERVER
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
                                                           [  OK  ]

Adicioné el nombre de mi servidor al archivo /etc/hosts al final de las lineas que comenzaban con 127.0.0.1 y ::1

# vi /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 WEBSERVER
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6 WEBSERVER

Reinicié nuevamente el servidor web

# service httpd restart

Y el error desapareció y así logré conectarme sin inconvenientes a la base de datos tal cual lo hacia a nivel de desarrollo.

Otra posible causa de error

Quizá el problema que tengas es en el propio controlador OCI8 y su versión.


Para corregir el problema primero deberás verificar cual es la versión de tu driver oci8, para ello tienes dos opciones:
Opción 1. crearte el archivo info.php en el directorio raíz de tu sitio web con el siguiente contenido:

<?php phpinfo() ?>

Y acceder desde tu navegador web a través de la url http://tu.sitio/info.php. O si es local por medio de http://localhost/info.php

Ahora busca la sección de oci8 y ahí encontraras la versión del driver:

oci8

OCI8 Supportenabled
......
Version2.0.6
......


Opcion 2. Si tienes el CLI de php instalado ejecuta desde la linea de comandos:

$ php --ri oci8

y te desplegará algo similar a:

oci8

OCI8 Support => enabled
Version => 2.0.6
... => ...

Tanto por una opción o por otra obtenemos el mismo resultado: Versión de OCI8 "2.0.6" y precisamente ahí esta el problema.

Al parecer, en la versión 2 del driver OCI 8 se realizaron algunos cambios que están generando problemas en Codeigniter.

Es por eso que si la versión del driver OCI8 es 2.0.x, debemos instalar el último controlador estable de la versión 1.

¿Cómo hacemos eso?


Ahora bien, hagamos el cambio de versión del driver OCI 8 en GNU/Linux CentOS 6, si utilizas Ubuntu, Fedora, RedHat u otras distribuciones, no te preocupes pues también aplica.

Primero, desinstalamos el driver OCI 8 2.x desde la linea de comandos como superusuario:

# pecl uninstall oci8

instalamos el driver oci8 1.4.10

# pecl install oci8-1.4.10

Una vez concluido reiniciamos nuestro servidor Apache

# service httpd restart

Nuevamente comprobamos la versión de nuestro driver para verificar que todo este bien.

oci8

OCI8 Supportenabled
Version1.4.10
Revision$Id: 44bfa713983a99b3e59477f6532e...
Active Persistent Connections0
Active Connections0
Oracle Run-time Client Library Version12.1.0.1.0
Oracle Instant Client Version12.1
Temporary Lob supportenabled
Collections supportenabled

Ahora probamos nuevamente la conexión a nuestra base de datos y los mensajes de error habrán desaparecido.

Si te gustó esta publicación no olvides compartirlo. Espero sus comentarios.



3 comentarios:

  1. De donde bajo la versión del driver oci8 1.4.10

    ResponderEliminar
  2. Yo tengo instalado

    OCI8 Support enabled
    Version 1.3.5
    Revision $Revision: 289423 $
    Active Persistent
    Connections 0
    Active Connections 0
    Temporary Lob
    support enabled
    Collections support enabled


    Y me sigues saliendo los mismos errores ..

    ResponderEliminar
  3. Yo sigo teniendo el mismo problema después de seguir los pasos sugeridos :(


    A PHP Error was encountered
    Severity: Warning
    Message: ociparse() expects parameter 1 to be resource, boolean given
    Filename: oci8/oci8_driver.php
    Line Number: 186

    A PHP Error was encountered
    Severity: Warning
    Message: ocisetprefetch() expects parameter 1 to be resource, null given
    Filename: oci8/oci8_driver.php
    Line Number: 171

    A PHP Error was encountered
    Severity: Warning
    Message: ocifetchinto() expects parameter 1 to be resource, null given
    Filename: oci8/oci8_result.php
    Line Number: 155

    ResponderEliminar