Compiling an Oracle Instant Client (OCI8) PHP Module
These are the steps involved in creating a PHP module for Oracle Instant Client (OCI8) 1.2.5 (or higher) in Red Hat Enterprise Linux 5.1 or CentOS 5.1. in an x86-64 environment.
Required Packages:
- gcc
- glibc
- httpd
- libaio
- make
- php
- php-devel
- php-pear
If you need help installing a package, please read how to install packages using YUM.
32 bit users note: The instructions are exactly the same for a 32 bit OS, just change
/client64/to/client/in all the commands below.
First things first, go to Oracle:
http://www.oracle.com/technology/software/tech/oci/instantclient/index.html
and download and install the RPM packages for Instant Client Package - Basic and Instant Client Package - SDK. An Oracle Technology Network username/password is required to download the files.
Note: As of writing this, the latest version of the Instant Client package available was 11.1.0.1. If you downloaded a newer (or older) version make sure the use those version numbers in the steps below.
After downloading the packages, install them using the RPM command:
rpm -Uvh oracle-instantclient-basic-11.1.0.1-1.x86_64.rpm
rpm -Uvh oracle-instantclient-devel-11.1.0.1-1.x86_64.rpm
Once those packages are installed, switch into a temporary directory and enter the following commands to set the required environmental variables:
export LD_LIBRARY_PATH=/usr/lib/oracle/11.1.0.1/client64/
export ORACLE_HOME=/usr/lib/oracle/11.1.0.1/client64/
Also, add those lines to the end of /etc/bashrc so the variables stay effective after reboot.
Note: The following command is only necessary for users installing a version of OCI8 prior to 1.2.5. If you just downloaded the latest version, you can skip this step.
The SDK headers need to be copied into the client library so the compiler can find them:
cp /usr/include/oracle/11.1.0.1/client64/* /usr/lib/oracle/11.1.0.1/client64/lib/
Now comes a challenge that took me a little while to figure out. We want to install the OCI8 package from PEAR, however the package is too large (more than 8 mb) to be handled in memory by the standard PECL installer, so we need to perform an extra step. We're going to use PECL to download the OCI8 package:
pecl -v download oci8
in this case the downloaded file is called oci8-1.2.5.tgz. Now we use PEAR to install it:
pear -v install oci8-1.2.5.tgz
It should scroll through a bunch of stuff making sure you have the proper software and packages installed on the machine. If everything is in order, it will prompt for the location of the Oracle client libraries. We're going to spcify that it use the Instant Client, and we're going to tell it the location of the libraries with the following line:
instantclient,/usr/lib/oracle/11.1.0.1/client64/lib
When the compilation is complete, you should receive the message "Build process completed successfully". To add the module to PHP, switch into the /etc/php.d/ directory and create a file called oci8.ini, and in it put:
extension=oci8.so
64 bit users installing a version of OCI8 prior to 1.2.5 note:
The module that we just created has to be moved into the 64 bit modules folder
cp /usr/lib/php/modules/oci8.so /usr/lib64/php/modules/
Now all we have to do is restart Apache:
service httpd restart
and take a look at phpinfo() and we should now see a section for OCI8.
If you're getting an error like:
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/oci8.so' - /usr/lib/oracle/11.1.0.1/client64/lib/libnnz11.so: cannot restore segment pret after reloc: Permission denied in Unknown on line 0after compiling and installing an Oracle OCI8 module for PHP you might need to change your SELINUX settings to allow the execution of the oci8.so module or simply disable
SELINUXaltogether
Comments
2 Responses to “Compiling an Oracle Instant Client (OCI8) PHP Module”
Leave a Reply
[...] you’re getting an error after compiling and installing an Oracle OCI8 module for PHP you might want to set SELINUX to permissive or disabled until you are able to resolve the [...]
[...] 2009 in Linux/Unix, PHP Chris Sibert wrote a good tutorial on installing the Oracle library for PHP. If you’re running SELinux, I’d recommend temporarily turning it off to get the module [...]