A forma mais *@#$!* para habilitar conexões ao banco de dados Oracle no PHP5 rodando sobre o Ubuntu

A forma mais *@#$!* para habilitar conexões ao banco de dados Oracle no PHP5 rodando sobre o Ubuntu

· 3 minutos

Este artigo está disponível como um gist. Sinta-se livre para contribuir.

Agradecimentos especiais para:

Primeiro passo: Instalação do cliente Oracle

  1. Faça o download do Instant Client em http://www.oracle.com/technetwork/indexes/downloads/index.html#database (você deve ter um usuário registrado no site da Oracle; o registro é gratuito). Você precisa dos arquivos instantclient-basic-*-*.zip e instantclient-sdk-*-*.zip.

  2. Execute os seguintes comandos no seu terminal:

    $ sudo su - $ mkdir -p /opt/oracle/instantclient $ cd /opt/oracle/instantclient

  3. Copie os arquivos baixados em /opt/oracle/instantclient.

  4. Descompacte os arquivos executando estes comandos:

    $ unzip instantclient-basic--.zip $ unzip instantclient-sdk--.zip

  5. Mova todos o conteúdo de /opt/oracle/instantclient/instantclient para /opt/oracle/instantclient:

    $ mv instantclient*/* ./ $ rmdir instantclient*/

  6. Durante a compilação do código da extensão, alguns erros podem surgir quando forem resolvidas as dependências de algumas libraries. Para evitá-los, faça:

    $ ln -s libclntsh.so.* libclntsh.so $ ln -s libocci.so.* libocci.so $ echo /opt/oracle/instantclient >> /etc/ld.so.conf $ ldconfig

  7. Crie um diretório para seus arquivos de configuração de rede:

    $ mkdir -p network/admin

  8. Coloque os arquivos sqlnet.ora e tnsnames.ora em /opt/oracle/instantclient/network/admin.

Agora você tem o kit básico para conexões e acesso à SDK para compilar extensões PHP com Oracle.

Segundo passo: Instalação da extensão PHP OCI8

  1. Pegue todos os pacotes essenciais para baixar e compilar a partir de repositórios PEAR:

    $ apt-get install --yes php5 php5-cli php5-dev php-db php-pear $ apt-get install --yes build-essential libaio1

  2. Requisite a instalação do OCI8:

    $ pecl install oci8

    Digite instantclient,/opt/oracle/instantclient quando perguntado pelo local de instalação do Instant Client.

  3. Salve este texto em /etc/php5/mods-available/oci8.ini:

    extension=oci8.so

  4. Ative a extensão:

    $ php5enmod oci8

Agora você tem todas as funções PHP oci_* disponíveis tanto via php-cli quanto via Apache.

Terceiro passo: Instalação da extensão PHP PDO/OCI

A biblioteca pdo_oci está desatualizada, então sua instalação é mais "engenhosa".

  1. Corrija alguns caminhos de arquivo:

    $ cd /usr/include/ $ ln -s php5 php $ cd /opt/oracle/instantclient $ mkdir -p include/oracle/11.1/ $ cd include/oracle/11.1/ $ ln -s ../../../sdk/include client $ cd - $ mkdir -p lib/oracle/11.1/client $ cd lib/oracle/11.1/client $ ln -s ../../../../ lib $ cd -

  2. Baixe a pdo_oci via pecl:

    $ pecl channel-update pear.php.net $ mkdir -p /tmp/pear/download/ $ cd /tmp/pear/download/ $ pecl download pdo_oci

  3. Extraia o código-fonte:

    $ tar xvf PDO_OCI*.tgz $ cd PDO_OCI*

  4. Crie um arquivo chamado config.m4.patch:

    *** config.m4 2005-09-24 17:23:24.000000000 -0600 --- /home/myuser/Desktop/PDO_OCI-1.0/config.m4 2009-07-07 17:32:14.000000000 -0600


    *** 7,12 **** --- 7,14 ---- if test -s "$PDO_OCI_DIR/orainst/unix.rgs"; then PDO_OCI_VERSION=grep '"ocommon"' $PDO_OCI_DIR/orainst/unix.rgs | sed 's/[ ][ ]*/:/g' | cut -d: -f 6 | cut -c 2-4 test -z "$PDO_OCI_VERSION" && PDO_OCI_VERSION=7.3

    • elif test -f $PDO_OCI_DIR/lib/libclntsh.$SHLIB_SUFFIX_NAME.11.1; then
    • PDO_OCI_VERSION=11.1 elif test -f $PDO_OCI_DIR/lib/libclntsh.$SHLIB_SUFFIX_NAME.10.1; then PDO_OCI_VERSION=10.1 elif test -f $PDO_OCI_DIR/lib/libclntsh.$SHLIB_SUFFIX_NAME.9.0; then

    *** 119,124 **** --- 121,129 ---- 10.2) PHP_ADD_LIBRARY(clntsh, 1, PDO_OCI_SHARED_LIBADD) ;;

    • 11.1)
    • PHP_ADD_LIBRARY(clntsh, 1, PDO_OCI_SHARED_LIBADD)
    • ;; *) AC_MSG_ERROR(Unsupported Oracle version! $PDO_OCI_VERSION) ;; #EOF
  5. Aplique o patch:

    $ patch --dry-run -i config.m4.patch && patch -i config.m4.patch && phpize

  6. Substitua todas as referências de function_entry para zend_function_entry em pdo_oci.c.

  7. Configure, compile e instale:

    $ ORACLE_HOME=/opt/oracle/instantclient ./configure --with-pdo-oci=instantclient,/opt/oracle/instantclient,11.1 $ make && make test && make install && mv modules/pdo_oci.so /usr/lib/php5/*+lfs/

  8. Salve este texto em /etc/php5/mods-available/pdo_oci.ini:

    extension=pdo_oci.so

  9. Ative a extensão:

    $ php5enmod pdo_oci

E agora você pode pegar uma xícara de café.