ID: 31084 Updated by: [EMAIL PROTECTED] Reported By: cjbj at hotmail dot com -Status: Open +Status: Assigned Bug Type: OCI8 related Operating System: Linux PHP Version: 4.3.9 -Assigned To: +Assigned To: tony2001
Previous Comments: ------------------------------------------------------------------------ [2004-12-14 09:28:36] cjbj at hotmail dot com To see an unmunged copy of the diff, go to http://forums.oracle.com/forums/thread.jsp?nav=false&forum=178&thread=279365 ------------------------------------------------------------------------ [2004-12-14 09:16:28] cjbj at hotmail dot com Description: ------------ This is a suggested enhancement for PHP's ext/oci8/config.m4 to enable PHP to be built with the Oracle Instant Client 10.1 libraries and SDK. This allows PHP to connect to an existing, remote Oracle DB without needing a full install of Oracle. The diff adds a new configuration parameter --with-oci8-instant-client[=DIR] that takes the directory of the Oracle Instant Client libraries. It is the solution previously discussed with Antony. The new "--with-oci8-instant-client" and existing "--with-oci8" options are mutually exclusive. Instructions: Install the Instant Client "basic" and "SDK" packages from Oracle: http://www.oracle.com/technology/tech/oci/instantclient/instantclient.html Make sure a symbolic link exists from libclntsh.so pointing to libclntsh.so.10.1. If the Linux RPMs were installed then this is automatically created. Backup and apply the diff listed below to ext/oci8/config.m4 cd php-4.3.9 rm -rf autom4te.cache config.cache ./buildconf --force Run configure. These are the options I needed to use to install PHP 4.3.9 on my local Apache under Redhat 3: ./configure \ --with-oci8-instant-client=/usr/lib/oracle/10.1.0.3/client/lib \ --prefix=$HOME/php --with-apxs=$HOME/apache/bin/apxs \ --enable-sigchild --with-config-file-path=$HOME/apache/conf (Since I was on linux I could have used --with-oci8-instant-client without giving a directory) make install You might need to set LD_LIBRARY_PATH to /usr/lib/oracle/10.1.0.3/client/lib before starting Apache. If a connection string is needed, also set TNS_ADMIN. For Oracle-standard connection information see section 1.3 of http://www.oracle.com/technology/docs/tech/sql_plus/10103/readme_ic.htm Note: these changes have only been tested on Linux using the Oracle Instant Client 10.1.0.3 release and PHP 4.3.9. --- ext/oci8/config.m4.orig 2004-02-04 01:22:34.000000000 +1100 +++ ext/oci8/config.m4 2004-12-14 18:36:21.000000000 +1100 @@ -38,16 +38,46 @@ OCI8_VERSION=8.1 fi else - AC_MSG_ERROR(Oracle-OCI8 needed libraries not found) + AC_MSG_ERROR([Oracle (OCI8) required libraries not found]) fi AC_MSG_RESULT($OCI8_VERSION) ]) -PHP_ARG_WITH(oci8, for Oracle-OCI8 support, -[ --with-oci8[=DIR] Include Oracle-oci8 support. Default DIR is ORACLE_HOME.]) +AC_DEFUN(AC_OCI8IC_VERSION,[ + AC_MSG_CHECKING([Oracle Instant Client version]) + if test -f $PHP_OCI8_INSTANT_CLIENT/libociei.$SHLIB_SUFFIX_NAME; then + if test -f $PHP_OCI8_INSTANT_CLIENT/libclntsh.$SHLIB_SUFFIX_NAME.10.1; then + if test ! -f $PHP_OCI8_INSTANT_CLIENT/libclntsh.$SHLIB_SUFFIX_NAME; then + AC_MSG_ERROR([Link from $PHP_OCI8_INSTANT_CLIENT/libclntsh.$SHLIB_SUFFIX_NAME to libclntsh.$SHLIB_SUFFIX_NAME.10.1 not found]) + fi + OCI8_VERSION=10.1 + else + AC_MSG_ERROR([Oracle Instant Client library version not supported]) + fi + else + AC_MSG_ERROR([Oracle Instant Client libraries not found]) + fi + AC_MSG_RESULT([$OCI8_VERSION]) +]) + +PHP_ARG_WITH(oci8, for Oracle (OCI8) support using ORACLE_HOME installation, +[ --with-oci8[[=DIR]] Include Oracle (OCI8) support using an ORACLE_HOME + install. The default DIR is ORACLE_HOME]) + +PHP_ARG_WITH(oci8-instant-client, for Oracle (OCI8) support using Oracle Instant Client, +[ --with-oci8-instant-client[[=DIR]] Include Oracle (OCI8) support using + Oracle Instant Client. DIR is the directory with the + Instant Client libraries. On Linux it will default to + /usr/lib/oracle/<most_recent_version>/client/lib + Other platforms will need to have it explicitly specified.]) if test "$PHP_OCI8" != "no"; then - AC_MSG_CHECKING([Oracle Install-Dir]) + + if test "$PHP_OCI8_INSTANT_CLIENT" != "no"; then + AC_MSG_ERROR([--with-oci8 and --with-oci8-instant-client are mutually exclusive]) + fi + + AC_MSG_CHECKING([Oracle Install Directory]) if test "$PHP_OCI8" = "yes"; then OCI8_DIR=$ORACLE_HOME else @@ -116,14 +146,18 @@ -L$OCI8_DIR/lib $OCI8_SHARED_LIBADD ]) ;; + 10.1) PHP_ADD_LIBRARY(clntsh, 1, OCI8_SHARED_LIBADD) PHP_ADD_LIBPATH($OCI8_DIR/lib, OCI8_SHARED_LIBADD) AC_DEFINE(HAVE_OCI8_ATTR_STATEMENT,1,[ ]) AC_DEFINE(HAVE_OCI_9_2,1,[ ]) + AC_DEFINE(HAVE_OCI8_TEMP_LOB,1,[ ]) + AC_DEFINE(PHP_OCI8_HAVE_COLLECTIONS,1,[ ]) ;; + *) - AC_MSG_ERROR(Unsupported Oracle version!) + AC_MSG_ERROR([Unsupported Oracle version]) ;; esac @@ -145,10 +179,88 @@ -L$OCI8_DIR/lib $OCI8_SHARED_LIBADD ]) + dnl + dnl Check if we have collections + dnl + PHP_CHECK_LIBRARY(clntsh, OCICollAssign, + [ + AC_DEFINE(PHP_OCI8_HAVE_COLLECTIONS,1,[ ]) + ], [], [ + -L$OCI8_DIR/lib $OCI8_SHARED_LIBADD + ]) + + PHP_NEW_EXTENSION(oci8, oci8.c, $ext_shared) AC_DEFINE(HAVE_OCI8,1,[ ]) PHP_SUBST_OLD(OCI8_SHARED_LIBADD) PHP_SUBST_OLD(OCI8_DIR) PHP_SUBST_OLD(OCI8_VERSION) + +elif test "$PHP_OCI8_INSTANT_CLIENT" != "no"; then + + AC_MSG_CHECKING([Oracle Instant Client directory]) + if test "$PHP_OCI8_INSTANT_CLIENT" = "yes"; then +dnl Generally the Instant Client can be anywhere so the user must pass in the +dnl directory to the libraries. But on Linux we default to the most recent +dnl version in /usr/lib + PHP_OCI8_INSTANT_CLIENT=`ls -d /usr/lib/oracle/*/client/lib 2> /dev/null | tail -1` + if test -z "$PHP_OCI8_INSTANT_CLIENT"; then + AC_MSG_ERROR([Oracle Instant Client directory not found. Try --with-oci8-instant-client=DIR]) + fi + fi + AC_MSG_RESULT($PHP_OCI8_INSTANT_CLIENT) + + OCI8_DIR=$PHP_OCI8_INSTANT_CLIENT + + AC_MSG_CHECKING([Oracle Instant Client SDK header directory]) + +dnl Header directory for Instant Client SDK RPM install + OCISDKRPMINC=`echo "$PHP_OCI8_INSTANT_CLIENT" | sed -e 's!^/usr/lib/oracle/\(.*\)/client/lib[[/]]*$!/usr/include/oracle/\1/client!'` + +dnl Header directory for Instant Client SDK zip file install + OCISDKZIPINC=$PHP_OCI8_INSTANT_CLIENT/sdk/include + + if test -f "$OCISDKRPMINC/oci.h"; then + AC_MSG_RESULT($OCISDKRPMINC) + PHP_ADD_INCLUDE($OCISDKRPMINC) + OCI8INCDIR=$OCISDKRPMINC + elif test -f "$OCISDKZIPINC/oci.h"; then + AC_MSG_RESULT($OCISDKZIPINC) + PHP_ADD_INCLUDE($OCISDKZIPINC) + OCI8INCDIR=$OCISDKZIPINC + else + AC_MSG_ERROR([Oracle Instant Client SDK header files not found]) + fi + + OCISYSLIBLIST=`echo "$OCI8INCDIR" | sed -e 's!\(.*\)/include$!\1/demo/sysliblist!'` + if test -f "$OCISYSLIBLIST"; then + PHP_EVAL_LIBLINE(`cat $OCISYSLIBLIST`, OCI8_SYSLIB) + fi + + AC_OCI8IC_VERSION($PHP_OCI8_INSTANT_CLIENT) + case $OCI8_VERSION in + 10.1) + PHP_ADD_LIBRARY(clntsh, 1, OCI8_SHARED_LIBADD) + PHP_ADD_LIBPATH($PHP_OCI8_INSTANT_CLIENT, OCI8_SHARED_LIBADD) + ;; + + *) + AC_MSG_ERROR([Unsupported Oracle Instant Client version]) + ;; + esac + + AC_DEFINE(HAVE_OCI8_ATTR_STATEMENT,1,[ ]) + AC_DEFINE(HAVE_OCI_9_2,1,[ ]) + AC_DEFINE(HAVE_OCI8_TEMP_LOB,1,[ ]) + AC_DEFINE(PHP_OCI8_HAVE_COLLECTIONS,1,[ ]) + AC_DEFINE(HAVE_OCI_INSTANT_CLIENT,1,[ ]) + + PHP_NEW_EXTENSION(oci8, oci8.c, $ext_shared) + AC_DEFINE(HAVE_OCI8,1,[ ]) + + PHP_SUBST_OLD(OCI8_SHARED_LIBADD) + PHP_SUBST_OLD(OCI8_DIR) + PHP_SUBST_OLD(OCI8_VERSION) + fi ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=31084&edit=1