Instantly share code, notes, and snippets.

Embed
What would you like to do?
install Oracle PHP Extension (oracle OCI8) - instantclient for Mac OS 10.8 - homebrew environnement

Installation

This procedure is tested on Mac OS X 10.8 with Developpers tools installed (xCode).

PHP 5.4 installed with Homebrew.

Update: I wrote a blog post about this.

Preparation

Download the following files from Oracle website (yes, you need to create an account and accept terms):

Create and unzip all theses files into a the directory /usr/local/instantclient/11.2.0.3/. This directory will looks like:

.
├── BASIC_README
├── SQLPLUS_README
├── adrci
├── genezi
├── glogin.sql
├── libclntsh.dylib.11.1
├── libnnz11.dylib
├── libocci.dylib.11.1
├── libociei.dylib
├── libocijdbc11.dylib
├── libsqlplus.dylib
├── libsqlplusic.dylib
├── ojdbc5.jar
├── ojdbc6.jar
├── sdk
│   ├── SDK_README
│   ├── demo
│   ├── include
│   ├── ott
│   └── ottclasses.zip
├── sqlplus
├── uidrvci
└── xstreams.jar

Create symlinks

   ln -s /usr/local/instantclient/11.2.0.3/sdk/include/*.h /usr/local/include/
   ln -s /usr/local/instantclient/11.2.0.3/sqlplus /usr/local/bin/
   ln -s /usr/local/instantclient/11.2.0.3/*.dylib /usr/local/lib/
   ln -s /usr/local/instantclient/11.2.0.3/*.dylib.11.1 /usr/local/lib/
   ln -s /usr/local/lib/libclntsh.dylib.11.1 /usr/local/lib/libclntsh.dylib

Test with sqlplus instantclient

I recommand to install Oracle Server with a VirtualBox VM preinstalled.

   /usr/local/bin/sqlplus oracle/oracle@192.168.56.101

Install extension with pecl

   pecl install oci8

If the script prompt you to provide the path to ORACLE_HOME directory, respond with:

instantclient,/usr/local/lib

And your are done, normally pecl will automatically load the extension in your php.ini. If not, add the following line to your php.ini:

extension=oci8.so

Restart your HTTP Server and test.

Enjoy (or try to...) !

@rkempter

This comment has been minimized.

Show comment
Hide comment
@rkempter

rkempter Mar 25, 2013

  • ln -s /usr/local/instantclient/11.2.0.3/.h /usr/local/includes/ -> ln -s /usr/local/instantclient/11.2.0.3/sdk/include/.h /usr/local/include/
  • /usr//local/bin/sqlplus scott/tiger@myoracle -> /usr/local/bin/sqlplus scott/tiger@myoracle and password didn't work for me

rkempter commented Mar 25, 2013

  • ln -s /usr/local/instantclient/11.2.0.3/.h /usr/local/includes/ -> ln -s /usr/local/instantclient/11.2.0.3/sdk/include/.h /usr/local/include/
  • /usr//local/bin/sqlplus scott/tiger@myoracle -> /usr/local/bin/sqlplus scott/tiger@myoracle and password didn't work for me
@wenbin1989

This comment has been minimized.

Show comment
Hide comment
@wenbin1989

wenbin1989 Nov 14, 2014

Your oci8 extension may only show in commond line by using "php -m" but doesn't show on the webpage by "phpinfo()". So that you still can't connect to oracle.

Solution: sudo vi /System/Library/LaunchDaemons/org.apache.httpd.plist

This plist is apache used to load all the environment variables. Add ORACLE_HOME, DYLD_LIBRARY_PATH, LD_LIBRARY_PATH into this plist. And then restart apache server.
The plist should look like the following.

<?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  <plist version="1.0">
  <dict>
    <key>Disabled</key>
    <true/>
    <key>Label</key>
    <string>org.apache.httpd</string>
    <key>EnvironmentVariables</key>
    <dict>
      <key>XPC_SERVICES_UNAVAILABLE</key>
      <string>1</string>
      <key>ORACLE_HOME</key>
      <string>/usr/local/lib/oracle/instantclient_11_2</string>
      <key>DYLD_LIBRARY_PATH</key>
      <string>/usr/local/lib/oracle/instantclient_11_2</string>
      <key>LD_LIBRARY_PATH</key>
      <string>/usr/local/lib/oracle/instantclient_11_2</string>
    </dict>
    <key>ProgramArguments</key>
    <array>
      <string>/usr/sbin/httpd</string>
      <string>-D</string>
      <string>FOREGROUND</string>
    </array>
    <key>OnDemand</key>
    <false/>
  </dict>

  </plist>

wenbin1989 commented Nov 14, 2014

Your oci8 extension may only show in commond line by using "php -m" but doesn't show on the webpage by "phpinfo()". So that you still can't connect to oracle.

Solution: sudo vi /System/Library/LaunchDaemons/org.apache.httpd.plist

This plist is apache used to load all the environment variables. Add ORACLE_HOME, DYLD_LIBRARY_PATH, LD_LIBRARY_PATH into this plist. And then restart apache server.
The plist should look like the following.

<?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  <plist version="1.0">
  <dict>
    <key>Disabled</key>
    <true/>
    <key>Label</key>
    <string>org.apache.httpd</string>
    <key>EnvironmentVariables</key>
    <dict>
      <key>XPC_SERVICES_UNAVAILABLE</key>
      <string>1</string>
      <key>ORACLE_HOME</key>
      <string>/usr/local/lib/oracle/instantclient_11_2</string>
      <key>DYLD_LIBRARY_PATH</key>
      <string>/usr/local/lib/oracle/instantclient_11_2</string>
      <key>LD_LIBRARY_PATH</key>
      <string>/usr/local/lib/oracle/instantclient_11_2</string>
    </dict>
    <key>ProgramArguments</key>
    <array>
      <string>/usr/sbin/httpd</string>
      <string>-D</string>
      <string>FOREGROUND</string>
    </array>
    <key>OnDemand</key>
    <false/>
  </dict>

  </plist>
@krismp

This comment has been minimized.

Show comment
Hide comment
@krismp

krismp Jul 22, 2015

php -m listed the oci8 extension but not in the phpinfo(). And I try this solution:

sudo vi /System/Library/LaunchDaemons/org.apache.httpd.plist

but still not working :(

krismp commented Jul 22, 2015

php -m listed the oci8 extension but not in the phpinfo(). And I try this solution:

sudo vi /System/Library/LaunchDaemons/org.apache.httpd.plist

but still not working :(

@calmdev

This comment has been minimized.

Show comment
Hide comment
@calmdev

calmdev Nov 5, 2015

These instructions have always worked for me until upgrading to El Capitan. After upgrading I kept running into the same issue as described above by @krismp. The only way I was able to resolve this was by disabling the system integrity protection as described here before trying to edit the plist as described above by @wenbin1989. After doing that everything works perfectly with apache and OCI8 is showing in the output of phpinfo(); Without first disabling S.I.P. the OS would not accept any changes to permissions or edits to the apache plist file.

calmdev commented Nov 5, 2015

These instructions have always worked for me until upgrading to El Capitan. After upgrading I kept running into the same issue as described above by @krismp. The only way I was able to resolve this was by disabling the system integrity protection as described here before trying to edit the plist as described above by @wenbin1989. After doing that everything works perfectly with apache and OCI8 is showing in the output of phpinfo(); Without first disabling S.I.P. the OS would not accept any changes to permissions or edits to the apache plist file.

@apit

This comment has been minimized.

Show comment
Hide comment
@apit

apit Jan 1, 2016

disabling SIP and adding paths to plist didnt work for me. instead, i symlink-ing all instantclient dylibs into /homebrew-root/Cellar/httpd24/2.4.16/lib/

apit commented Jan 1, 2016

disabling SIP and adding paths to plist didnt work for me. instead, i symlink-ing all instantclient dylibs into /homebrew-root/Cellar/httpd24/2.4.16/lib/

@the7th

This comment has been minimized.

Show comment
Hide comment

the7th commented May 9, 2016

@XavRsl

This comment has been minimized.

Show comment
Hide comment
@XavRsl

XavRsl May 13, 2016

Hi,
Just a note for my futur self (and others). If using only php (no nginx or httpd), you may add env vars to php plist file, adding them to php-fpm.conf doesn't seem to work. Here's how :

file ~/Library/LaunchAgents/homebrew.mxcl.php70.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>KeepAlive</key>
  <true/>
  <key>Label</key>
  <string>homebrew.mxcl.php70</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/opt/php70/sbin/php-fpm</string>
    <string>--fpm-config</string>
    <string>/usr/local/etc/php/7.0/php-fpm.conf</string>
  </array>
  <key>EnvironmentVariables</key>
  <dict>
    <key>DYLD_LIBRARY_PATH</key>
    <string>/opt/oracle/instantclient_11_2</string>
    <key>LD_LIBRARY_PATH</key>
    <string>/opt/oracle/instantclient_11_2</string>
  </dict>
  <key>RunAtLoad</key>
  <true/>
  <key>LaunchOnlyOnce</key>
  <true/>
  <key>UserName</key>
  <string>roussel</string>
  <key>WorkingDirectory</key>
  <string>/usr/local/var</string>
  <key>StandardErrorPath</key>
  <string>/usr/local/opt/php70/var/log/php-fpm.log</string>
</dict>
</plist>

This is how you would make Oracle DB work with Laravel Valet that uses php server capabilities on a php-fpm brew install.

Xavier

XavRsl commented May 13, 2016

Hi,
Just a note for my futur self (and others). If using only php (no nginx or httpd), you may add env vars to php plist file, adding them to php-fpm.conf doesn't seem to work. Here's how :

file ~/Library/LaunchAgents/homebrew.mxcl.php70.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>KeepAlive</key>
  <true/>
  <key>Label</key>
  <string>homebrew.mxcl.php70</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/opt/php70/sbin/php-fpm</string>
    <string>--fpm-config</string>
    <string>/usr/local/etc/php/7.0/php-fpm.conf</string>
  </array>
  <key>EnvironmentVariables</key>
  <dict>
    <key>DYLD_LIBRARY_PATH</key>
    <string>/opt/oracle/instantclient_11_2</string>
    <key>LD_LIBRARY_PATH</key>
    <string>/opt/oracle/instantclient_11_2</string>
  </dict>
  <key>RunAtLoad</key>
  <true/>
  <key>LaunchOnlyOnce</key>
  <true/>
  <key>UserName</key>
  <string>roussel</string>
  <key>WorkingDirectory</key>
  <string>/usr/local/var</string>
  <key>StandardErrorPath</key>
  <string>/usr/local/opt/php70/var/log/php-fpm.log</string>
</dict>
</plist>

This is how you would make Oracle DB work with Laravel Valet that uses php server capabilities on a php-fpm brew install.

Xavier

@jalex19100

This comment has been minimized.

Show comment
Hide comment
@jalex19100

jalex19100 Jun 17, 2016

You do not need to edit the plist to add environment variables to Apache. Use "SetEnv ORACLE_HOME ..." in the httpd.conf. Trying to work around SIP isn't even necessary.

jalex19100 commented Jun 17, 2016

You do not need to edit the plist to add environment variables to Apache. Use "SetEnv ORACLE_HOME ..." in the httpd.conf. Trying to work around SIP isn't even necessary.

@rafaelgrube

This comment has been minimized.

Show comment
Hide comment
@rafaelgrube

rafaelgrube Jul 15, 2016

I tried the test from sqlplus, but always I received the ERROR: ORA-21561: OID generation failed. I looked on the internet and most of people said this is a problem with my hosts file. But I tried with IP and a received the same error. Any tip for this?

/usr/local/bin/sqlplus user/password@172.16.1.10:1521/DATABASE

rafaelgrube commented Jul 15, 2016

I tried the test from sqlplus, but always I received the ERROR: ORA-21561: OID generation failed. I looked on the internet and most of people said this is a problem with my hosts file. But I tried with IP and a received the same error. Any tip for this?

/usr/local/bin/sqlplus user/password@172.16.1.10:1521/DATABASE

@mrbrownisintown

This comment has been minimized.

Show comment
Hide comment
@mrbrownisintown

mrbrownisintown Jul 28, 2016

I've installed oracle instant client on El Capitan and am up and running, but it took me quite a part of the day...

For oracle instant client version 12.1.0.2 on El Capitan, the symlinks are slightly different:

sudo mkdir /usr/local/instantclient
sudo mkdir /usr/local/instantclient/12.1.0.2
sudo ln -s /usr/local/instantclient/12.1.0.2/sdk/include/*.h /usr/local/include/
sudo ln -s /usr/local/instantclient/12.1.0.2/sqlplus /usr/local/bin/
sudo ln -s /usr/local/instantclient/12.1.0.2/*.dylib /usr/local/lib/
sudo ln -s /usr/local/instantclient/12.1.0.2/*.dylib.12.1 /usr/local/lib/
sudo ln -s /usr/local/lib/libclntsh.dylib.12.1 /usr/local/lib/libclntsh.dylib

A couple things I've found:

sudo pecl install -f oci8-2.0.11

  • phpize didn't seem to work, check below how to check this (it didn't show PHP Api version etc), so I had to install/update xcode command line: xcode-select --install

running: phpize
grep: /usr/include/php/main/php.h: No such file or directory
grep: /usr/include/php/Zend/zend_modules.h: No such file or directory
grep: /usr/include/php/Zend/zend_extensions.h: No such file or directory
Configuring for:
PHP Api Version:
Zend Module Api No:
Zend Extension Api No:

mrbrownisintown commented Jul 28, 2016

I've installed oracle instant client on El Capitan and am up and running, but it took me quite a part of the day...

For oracle instant client version 12.1.0.2 on El Capitan, the symlinks are slightly different:

sudo mkdir /usr/local/instantclient
sudo mkdir /usr/local/instantclient/12.1.0.2
sudo ln -s /usr/local/instantclient/12.1.0.2/sdk/include/*.h /usr/local/include/
sudo ln -s /usr/local/instantclient/12.1.0.2/sqlplus /usr/local/bin/
sudo ln -s /usr/local/instantclient/12.1.0.2/*.dylib /usr/local/lib/
sudo ln -s /usr/local/instantclient/12.1.0.2/*.dylib.12.1 /usr/local/lib/
sudo ln -s /usr/local/lib/libclntsh.dylib.12.1 /usr/local/lib/libclntsh.dylib

A couple things I've found:

sudo pecl install -f oci8-2.0.11

  • phpize didn't seem to work, check below how to check this (it didn't show PHP Api version etc), so I had to install/update xcode command line: xcode-select --install

running: phpize
grep: /usr/include/php/main/php.h: No such file or directory
grep: /usr/include/php/Zend/zend_modules.h: No such file or directory
grep: /usr/include/php/Zend/zend_extensions.h: No such file or directory
Configuring for:
PHP Api Version:
Zend Module Api No:
Zend Extension Api No:

@andreecy

This comment has been minimized.

Show comment
Hide comment
@andreecy

andreecy Nov 16, 2017

thaaank you so much! work for me on Sierra

andreecy commented Nov 16, 2017

thaaank you so much! work for me on Sierra

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment