无法加载动态库'oci8.so'(PHP 7.2)

She*_*hen 2 php oci8 docker

自从PHP 7.1更新到PHP 7.2后,我无法安装oci8.我有这个错误:

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

PHP警告:PHP启动:无法加载动态库'oci8.so'(试过:/usr/local/lib/php/extensions/no-debug-non-zts-20170718/oci8.so(libmql1.so:无法打开)共享对象文件:没有这样的文件或目录),/ usr/local/lib/php/extensions/no-debug-non-zts-1701/170/////-debug-non-zts-20170718/oci8.so.so:无法打开共享对象文件:没有这样的文件或目录))在第0行的Unknown中

PHP 7.2.0(cli)(内置:2017年12月12日05:52:58)(NTS)版权所有(c)1997-2017 PHP Group Zend Engine v3.2.0,版权所有(c)1998-2017 Zend Technologies with Zend OPcache Zend Technologies的v7.2.0,版权所有(c)1999-2017

我正在使用Docker环境,我为此创建了一个github repo,如果我使用PHP的7.1版本(shenron/docker-php-fpm:7.2),它就可以工作.

我不明白为什么脚本试图启动这个文件:/usr/local/lib/php/extensions/no-debug-non-zts-20170718/oci8.so.so.

就我而言,有两种可能性; 或者驱动程序不兼容,或者pecl今天不能安装oci8.

有没有人有同样的问题?

谢谢您的帮助.

Jon*_*abe 11

/usr/local/lib/php/extensions/no-debug-non-zts-20170718/oci8.so.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)

oci8.so它本身依赖于多个共享库,您可以使用它ldd来找出哪些库:

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
Run Code Online (Sandbox Code Playgroud)

这些.so文件似乎是存储库中zip文件的一部分.像这样运行PHP LD_LIBRARY_PATH=/usr/local/instantclient_12_1/ php在容器内运行正常.您需要将这些文件移动到理智的位置.

  • 非常感谢您的帮助 !我更新了我的Docker文件以解决问题:`ENV LD_LIBRARY_PATH/usr/local/instantclient_12_1 /` (4认同)

use*_*650 7

对于任何遇到这个问题的人,这里是在 linux 中处理它的正确方法。(我在下面的演示中使用 CentOS 命令,但 Ubnutu 应该没有任何不同)

第 1 步:获取 oracle 库

编辑:感谢 Christopher Jones 的评论,您可以在https://yum.oracle.com/repo/OracleLinux/OL7/oracle/instantclient/x86_64/找到直接的 rpm 链接

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 
Run Code Online (Sandbox Code Playgroud)

第 2 步:安装

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 
Run Code Online (Sandbox Code Playgroud)

第 3 步:配置(使 oracle 库的路径可被发现)

sudo sh -c "echo /usr/lib/oracle/18.3/client64/lib > /etc/ld.so.conf.d/oracle.conf"
sudo ldconfig
Run Code Online (Sandbox Code Playgroud)

测试

php -v
# and you should get something like
PHP 7.2.12 (cli) (built: Nov  6 2018 16:40:25)...
Run Code Online (Sandbox Code Playgroud)