7

Since the update of PHP 7.1 to PHP 7.2 I can't install oci8. I have this error:

root@3ab6027c8d95:/var/www# php -v

PHP Warning: PHP Startup: Unable to load dynamic library 'oci8.so' (tried: /usr/local/lib/php/extensions/no-debug-non-zts-20170718/oci8.so (libmql1.so: cannot open shared object file: No such file or directory), /usr/local/lib/php/extensions/no-debug-non-zts-20170718/oci8.so.so (/usr/local/lib/php/extensions/no-debug-non-zts-20170718/oci8.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0

PHP 7.2.0 (cli) (built: Dec 12 2017 05:52:58) ( NTS ) Copyright (c) 1997-2017 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2017 Zend Technologies with Zend OPcache v7.2.0, Copyright (c) 1999-2017, by Zend Technologies

I'm using Docker environment, I created a github repo for this, it works if I use the version 7.1 of PHP (shenron/docker-php-fpm:7.2).

I don't understand why the script try to launch this file: /usr/local/lib/php/extensions/no-debug-non-zts-20170718/oci8.so.so.

To my point of view there are two possibilities; or the driver is not compatible, or pecl can't today install oci8.

Has anyone the same problem ?

Thank you for your help.

Shen
  • 131
  • 1
  • 2
  • 7
  • This worked for me https://stackoverflow.com/questions/47771132/php7-0-fpm-with-docker-unable-to-load-dynamic-library-oci8 – Miro Čillík Jun 05 '18 at 12:44

6 Answers6

14

/usr/local/lib/php/extensions/no-debug-non-zts-20170718/oci8.so.so is only the second guess on the shared library file name. You can safely ignore that.

The actual problem is: (tried: /usr/local/lib/php/extensions/no-debug-non-zts-20170718/oci8.so (libmql1.so: cannot open shared object file: No such file or directory)

oci8.so itself depends on multiple shared libraries, you can use ldd to find out which ones:

ldd /usr/local/lib/php/extensions/no-debug-non-zts-20170718/oci8.so
    linux-vdso.so.1 (0x00007ffc8bfe7000)
    libclntsh.so.12.1 => /usr/local/instantclient/libclntsh.so.12.1 (0x00007fb9919e0000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb991641000)
    libmql1.so => not found
    libipc1.so => not found
    libnnz12.so => not found
    libons.so => not found
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fb99143d000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb991139000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb990f1c000)
    libnsl.so.1 => /lib/x86_64-linux-gnu/libnsl.so.1 (0x00007fb990d04000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fb990afc000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fb994bc8000)
    libaio.so.1 => /lib/x86_64-linux-gnu/libaio.so.1 (0x00007fb9908fa000)
    libclntshcore.so.12.1 => not found

Those .so files seem to be part of a zip file in your repository. Running PHP like this LD_LIBRARY_PATH=/usr/local/instantclient_12_1/ php works fine inside your container. You need to move those so files to a sane location.

Jonas Osburg
  • 1,733
  • 1
  • 14
  • 17
  • 4
    Thank you very much for your help ! I updated my Docker file to fix the problem: `ENV LD_LIBRARY_PATH /usr/local/instantclient_12_1/` – Shen Dec 15 '17 at 19:15
  • It's generally better to use `ldconfig` to set the library path. This is shown on the Instant Client install page. This avoids issues with how and where to set LD_LIBRARY_PATH, and avoids issues with that variable being reset in some environments. – Christopher Jones Dec 11 '20 at 22:10
7

For anyone stumbling upon this question, here is the proper way to handle it in linux. (I am using CentOS commands for the demo below but Ubnutu shouldn't be any different)

step 1: get oracle libs

EDIT: Thanks to Christopher Jones for the comment, you can find the direct rpm links at https://yum.oracle.com/repo/OracleLinux/OL7/oracle/instantclient/x86_64/

wget oracle-instantclient18.3-basic-18.3.0.0.0-1.x86_64.rpm 
wget oracle-instantclient18.3-devel-18.3.0.0.0-1.x86_64.rpm 

step 2: install

yum install oracle-instantclient18.3-basic-18.3.0.0.0-1.x86_64.rpm
yum install  oracle-instantclient18.3-devel-18.3.0.0.0-1.x86_64.rpm 

step 3: configure (make the path of the oracle libs to be discoverable)

sudo sh -c "echo /usr/lib/oracle/18.3/client64/lib > /etc/ld.so.conf.d/oracle.conf"
sudo ldconfig

test

php -v
# and you should get something like
PHP 7.2.12 (cli) (built: Nov  6 2018 16:40:25)...
user728650
  • 1,828
  • 12
  • 13
  • The Instant Client RPMs are at http://yum.oracle.com/repo/OracleLinux/OL7/oracle/instantclient/x86_64/index.html so you can run `wget http://yum.oracle.com/repo/OracleLinux/OL7/oracle/instantclient/x86_64/getPackage/oracle-instantclient18.3-basic-18.3.0.0.0-2.x86_64.rpm` etc – Christopher Jones Nov 28 '18 at 22:30
3

If running ldd /usr/local/lib/php/extensions/no-debug-non-zts-20170718/oci8.so gives you something like this, with missing files:

ldd /usr/local/lib/php/extensions/no-debug-non-zts-20170718/oci8.so
    linux-vdso.so.1 (0x00007ffc8bfe7000)
    libclntsh.so.12.1 => /usr/local/instantclient/libclntsh.so.12.1 (0x00007fb9919e0000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb991641000)
    libmql1.so => not found
    libipc1.so => not found
    libnnz12.so => not found
    libons.so => not found
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fb99143d000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb991139000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb990f1c000)
    libnsl.so.1 => /lib/x86_64-linux-gnu/libnsl.so.1 (0x00007fb990d04000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fb990afc000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fb994bc8000)
    libaio.so.1 => /lib/x86_64-linux-gnu/libaio.so.1 (0x00007fb9908fa000)
    libclntshcore.so.12.1 => not found

You can add the folder to your ldconfig like this (other readers - your path may vary):

echo /usr/local/instantclient_12_1/ > /etc/ld.so.conf.d/oracle-instantclient.conf

Then run ldconfig to read the new config.

Greg
  • 316,276
  • 54
  • 369
  • 333
  • That did the trick for me in the instance that root could load the extension, but a non-root user could not. Thank you! – Beefjeff Dec 11 '20 at 13:15
2

Added this to my Dockerfile:

# Install Oracle instantclient and oci8 extension
RUN mkdir /opt/oracle \
    && curl 'https://download.oracle.com/otn_software/linux/instantclient/19600/instantclient-basic-linux.x64-19.6.0.0.0dbru.zip' --output /opt/oracle/instantclient-basic-linux.zip \
    && curl 'https://download.oracle.com/otn_software/linux/instantclient/19600/instantclient-sdk-linux.x64-19.6.0.0.0dbru.zip' --output /opt/oracle/instantclient-sdk-linux.zip \
    && unzip '/opt/oracle/instantclient-basic-linux.zip' -d /opt/oracle \
    && unzip '/opt/oracle/instantclient-sdk-linux.zip' -d /opt/oracle \
    && rm /opt/oracle/instantclient-*.zip \
    && mv /opt/oracle/instantclient_* /opt/oracle/instantclient \
    && docker-php-ext-configure oci8 --with-oci8=instantclient,/opt/oracle/instantclient \
    && docker-php-ext-install oci8 \
    && echo /opt/oracle/instantclient/ > /etc/ld.so.conf.d/oracle-insantclient.conf \
    && ldconfig

libaio1 also needs to be installed btw.

Tomme
  • 21
  • 1
  • My blog post [Docker for Oracle Database Applications in Node.js and Python](https://blogs.oracle.com/opal/docker-for-oracle-database-applications-in-nodejs-and-python-part-1) shows some other ways to install Instant Client for languages like PHP. – Christopher Jones May 03 '20 at 23:06
1

I had the same problem

"php -v

PHP Warning: PHP Startup: Unable to load dynamic library 'oci8.so' (tried: /usr/lib/php/20190902/oci8.so (libaio.so.1: cannot open shared object file: No such file or directory) , /usr/lib/php/20190902/oci8.so.so (/usr/lib/php/20190902/oci8.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0"

I solved it with the following command

apt-get install libaio1

Follow this tutorial for complete installation https://gist.github.com/milo/d4a15d67e6538bf82438babc39482b80

  • As it’s currently written, your answer is unclear. Please [edit] to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community Sep 24 '21 at 04:09
0

I had the problem with php8: I created the file etc/apache/envvars In that, I wrote: export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib export ORACLE_HOME=/usr/lib/oracle/11.2/client64

Then, it`s important, how the apache is restared (a systemctl restart did not work in my case). I did: apache2ctl stop apache2ctl start

...and everything was fine.

Kai Behncke
  • 129
  • 1
  • 7