【问题标题】:Installing OCI8 with PHP 5.6 on centOs (vagrant)在 centOs (vagrant) 上使用 PHP 5.6 安装 OCI8
【发布时间】:2019-08-23 16:08:29
【问题描述】:

根据我的理解和以前的安装,要在 centOs 上安装 oci8 和 php 5.6,我需要完成以下步骤:

  • 使用 RPM 安装 oracle-instantclient11.2-basic 和 oracle-instantclient11.2-devel。
  • 使用 pecl 安装 oci8 php 扩展。
  • 为 php.ini 添加扩展。

这就是我在配置文件中所做的。

installOracleInstantClient() {
  # ===================================================================
  # Install Oracle Support for PHP
  # ===================================================================
  if [ $(rpm -qa | grep -c 'oracle-instantclient') -eq 0 ]; then
    printLog 'Installing Oracle Client'
    yum --quiet -y install libaio

    yum -y --nogpgcheck --quiet install /opt/packages/oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm
    yum -y --nogpgcheck --quiet install /opt/packages/oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm

    cat > /etc/environment <<EOM
ORACLE_HOME="/usr/lib/oracle/11.2/client64"
LD_LIBRARY_PATH="/usr/lib/oracle/11.2/client64/lib"
EOM

    cat > /etc/profile.d/oracle.sh <<EOM
export ORACLE_HOME=/usr/lib/oracle/11.2/client64
export PATH=$PATH:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export TNS_ADMIN=$ORACLE_HOME/network/admin
EOM

    export ORACLE_HOME=/usr/lib/oracle/11.2/client64
    export PATH=$PATH:$ORACLE_HOME/bin
    export LD_LIBRARY_PATH=$ORACLE_HOME/lib
    export TNS_ADMIN=$ORACLE_HOME/network/admin


    mkdir -p /usr/lib/oracle/11.2/client64/network/admin -p
  fi
}

installPHP() {
  if [ $(rpm -qa | grep -c 'php') -eq 0 ]; then
    printLog 'Installing PHP'

    installGcc;

    installEPEL;

    installGit;

    printLog 'Adding php5.6 repositories'

    rpm -Uvh http://vault.centos.org/7.0.1406/extras/x86_64/Packages/epel-release-7-5.noarch.rpm
    rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

    yum install yum-utils

    printLog 'installing php packages'
    yum --enablerepo=remi,remi-php56 install --quiet -y php php-common php-cli php-pear php-pdo php-devel php-ldap php-mbstring php-bcmath php-mysqlnd php-soap php-gd php-xml php-simplexml php-curl php-zip php-oci8 php-ldap php-zip php-fileinfo

    # php-mssql php-sqlite php-mcrypt

    printLog 'Installing OCI8 extension for PHP'
    printf "instantclient,/usr/lib/oracle/11.2/client64" | pecl install oci8-2.0.12

    # bits to add oci to php.ini
    echo 'extension=oci8.so' >> /etc/php.ini

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

  fi
}

installOracleInstantClient;
installPHP;

在机器配置上我收到以下错误:

default: PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/oci8.so' - libclntsh.so.18.1: cannot open shared object file: No such file or directory in Unknown on line 0

default: PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/pdo_oci.so' - libclntsh.so.18.1: cannot open shared object file: No such file or directory in Unknown on line
 0 

当我 ssh 进入机器并执行 php -v 时也是如此。

执行ldd -r /usr/lib64/php/modules/oci8.so 会返回一堆Undefined symbol 错误和预期的libclntsh.so.18.1 =&gt; not found 行。

另外,php -i 不会返回正确安装 oci8 时通常显示的 OCI8 块。

知道我做错了什么吗?

【问题讨论】:

  • 您的脚本同时具有“yum instal ... php-oci8...”和“pecl install oci8”,请参阅我的回答,但显然不需要第二个

标签: php linux oracle vagrant


【解决方案1】:

您需要安装 Oracle 客户端 18c。我尝试安装 11.2 oracle 客户端并创建符号链接,但这不起作用。

more /etc/ld.so.conf.d/oracle.conf 
/u01/app/oracle/product/18.5.0


# ldd /usr/lib64/php/modules/oci8.so
linux-vdso.so.1 =>  (0x00007ffe2b368000)
libclntsh.so.18.1 => /u01/app/oracle/product/18.5.0/libclntsh.so.18.1 (0x00007f6bf18c3000)
libc.so.6 => /lib64/libc.so.6 (0x00007f6bf14f6000)
libmql1.so => /u01/app/oracle/product/18.5.0/libmql1.so (0x00007f6bf1296000)
libipc1.so => /u01/app/oracle/product/18.5.0/libipc1.so (0x00007f6bf0e24000)
libnnz18.so => /u01/app/oracle/product/18.5.0/libnnz18.so (0x00007f6bf06cf000)
libons.so => /u01/app/oracle/product/18.5.0/libons.so (0x00007f6bf047f000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f6bf027b000)
libm.so.6 => /lib64/libm.so.6 (0x00007f6beff79000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f6befd5d000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f6befb43000)
librt.so.1 => /lib64/librt.so.1 (0x00007f6bef93b000)
libaio.so.1 => /lib64/libaio.so.1 (0x00007f6bef739000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f6bef520000)
/lib64/ld-linux-x86-64.so.2 (0x00007f6bf5aab000)
libclntshcore.so.18.1 => /u01/app/oracle/product/18.5.0/libclntshcore.so.18.1 (0x00007f6beef3d000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f6beed27000)

【讨论】:

  • 18c 与 php 5.6 不兼容,对于这个特殊的旧项目,我需要 5.6
  • OCI8.so 模块是使用 Oracle 18c 客户端的库编译的。您需要使用 oracle 客户端 11.2 安装旧版本的 OCI8。
  • symlink 对库永远不起作用....如果 soname 不同...这意味着 API 不同....
【解决方案2】:

使用“remi-php56”存储库,您无需从源代码构建扩展,一切都在存储库中;)

  • php-oci8 提供 oci8 版本 2.0.12 和 pdo_oci8

(pecl命令只会安装oci8扩展,不会安装PDO驱动)

使用 Oracle Client 18c 构建包,并允许连接到服务器版本 18c、12.2、12.1 和 11.2。

【讨论】:

  • 我拿出了pecl声明,只有一个php-oci8,但现在我得到default: PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/oci8.so' - libclntsh.so.18.1: cannot open shared object file: No such file or directory in Unknown on line 0 default: PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/pdo_oci.so' - libclntsh.so.18.1: cannot open shared object file: No such file or directory in Unknown on line 0错误。
  • 正如我所说,您需要 Oracle Client 18c,而不是 11.2
  • 这不是一件容易的事,但我成功了。非常感谢您的帮助。
猜你喜欢
  • 2013-11-11
  • 1970-01-01
  • 2015-11-20
  • 2021-10-10
  • 2011-09-03
  • 1970-01-01
  • 2020-11-17
  • 2011-10-17
  • 2015-12-31
相关资源
最近更新 更多