• linux系统下php通过php_oci8扩展连接oracle数据库 Nginx


    相关版本信息:

    PHP Version 5.6.30

    nginx version: nginx/1.10.3

    Linux version 2.6.32-358.el6.x86_64 (mockbuild@c6b8.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC) ) #1 SMP Fri Feb 22 00:31:26 UTC 2013

    64位

    php连接oracle数据库虽然不是最佳拍档,但组内开发确实有这样需求。如果没有参考合适的文档,这个过程还是挺折磨人的,下面是一个记录,原型是国外的一篇博客 Installing PDO_OCI and OCI8 PHP extensions on CentOS 6.4 64bit

    假设你已经安装好php的环境,php版本为5.3,要连接的oracle服务器是 11g R2,操作系统版本CentOS 6.4 x86_64。如果没有安装php,可以通过以下命令安装:

    1. 安装InstantClient

    instantclient是oracle的连接数据库的简单客户端,不用安装一个500Moracle客户端就可以连接oracle数据库,有windows和linux版本。从 这里 选择需要的版本下载,只需Basic和Devel两个rpm包。

    第一个坑:这里下载的话最好是要注册一个oracle官方的账号,下载时提示登录,登录后再下载就可以,因为我之前直接下载了好几次,安装都出错,因为下载的其实是个网页,而不是真正的rpm包。

    安装
    # rpm -ivh oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm
    # rpm -ivh oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm
    
    软链接
    # ln -s /usr/include/oracle/11.2/client64 /usr/include/oracle/11.2/client
    # ln -s /usr/lib/oracle/11.2/client64 /usr/lib/oracle/11.2/client

    64位系统需要创建32位的软链接,这里可能是一个遗留bug,不然后面编译会出问题。

    接下来还要让系统能够找到oracle客户端的库文件,修改LD_LIBRARY_PATH:

    # vi /etc/profile.d/oracle.sh
    export ORACLE_HOME=/usr/lib/oracle/11.2/client64
    export LD_LIBRARY_PATH=$ORACLE_HOME/lib

    执行 source /etc/profile.d/oracle.sh 使环境变量生效。

    2. 安装PDO_OCI

    这里我并没有安装这个扩展,我只安装了oci8,直接看第三步(by:sunfei)

    在连接互联网的情况下,通过pecl在线安装php的扩展非常简单,参考 How to install oracle instantclient and pdo_oci on ubuntu machine 。

    从 https://pecl.php.net/package/PDO_OCI 下载 PDO_OCI-1.0.tgz 源文件。

    # wget https://pecl.php.net/get/PDO_OCI-1.0.tgz
    # tar -xvf PDO_OCI-1.0.tgz
    # cd PDO_OCI-1.0

    由于PDO_OCI很久没有更新,所以下面需要编辑 ODI_OCI-1.0 文件夹里的 config.m4 文件来让它支持11g:

    # 在第10行左右找到与下面类似的代码,添加这两行:
    elif test -f $PDO_OCI_DIR/lib/libclntsh.$SHLIB_SUFFIX_NAME.11.2; then
      PDO_OCI_VERSION=11.2
    
    # 在第101行左右添加这几行:
    11.2)
      PHP_ADD_LIBRARY(clntsh, 1, PDO_OCI_SHARED_LIBADD)
      ;;

    编译安装pdo_oci扩展:(安装完成后可在 /usr/lib64/php/modules/pdo_oci.so 找到这个模块)

    $ phpize
    $ ./configure --with-pdo-oci=instantclient,/usr,11.2
    $ make
    $ sudo make install

    在make的时候报错

    For Red hat 6, 64bits, client 11.2,
    After touch config.m4 and tune up libs symlinks..
    I get a compilation error "pdo_oci.c:34: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘pdo_oci_functions’"
    To solve it just change function_entry to zend_function_entry @pdo_oci.c file.
     
    修改文件pdo_oci.c
    34行function_entry 改成 zend_function_entry
     

     #这个步骤可以不要

    要启用这个扩展,在 /etc/php.d/ 下新建一个 pdo_oci.ini 文件,内容:
    
    extension=pdo_oci.so

    直接在php.info 添加

    extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/pdo_oci.so

     验证安装成功:

    # php -i|grep oci
    看到类似下面的内容则安装成功:
    /etc/php.d/pdo_oci.ini,
    PDO drivers => oci, sqlite
    
    或
    # php -m

    3. 安装OCI8

    从 https://pecl.php.net/package/oci8 下载oci8-2.0.8.tgz源文件。

    第二个坑:这里要先进入到wphp扩展目录/usr/local/php/include/php/ext,然后下载,解压

    # wget https://pecl.php.net/get/oci8-2.0.8.tgz
    # tar -xvf oci8-2.0.8.tgz
    # cd oci8-2.0.8

    编译安装oci8扩展:

    # phpize
    # ./configure --with-oci8=shared,instantclient,/usr/lib/oracle/11.2/client64/lib
    # make
    # make install

    要启用这个扩展,在 /etc/php.d/ 下新建一个 oci8.ini 文件,内容:

    第四个坑:上一步的make install完成后,屏幕显示一个路径出来,这个路径就是oci8.so文件的位置,文件有了,然后还得到php.ini中去增加配置,wdcp面板php.ini的路径在/usr/local/php/etc/php.ini,到配置文件的最后,加上一行extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/oci8.so

    ,我是加到了zend相关配置的前面,因为有人说加到最后不行,你可以自己试试。

    extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/oci8.so

    然后重启nginx,到此为止,你基本上就算成功了。

    extension=oci8.so

    验证安装成功:

    # php -i|grep oci8
    

      oci8
      oci8.connection_class => no value => no value
      oci8.default_prefetch => 100 => 100
      oci8.events => Off => Off
      oci8.max_persistent => -1 => -1
      oci8.old_oci_close_semantics => Off => Off
      oci8.persistent_timeout => -1 => -1
      oci8.ping_interval => 60 => 60
      oci8.privileged_connect => Off => Off
      oci8.statement_cache_size => 20 => 20

    最后别忘了重启逆web服务器如nginx,可以通过phpinfo()来确保扩展是否成功安装。

    4. 测试连接

    在你web服务器如apache的php目录下创建 testoci.php :

    第五个坑:下面这段代码里,显示$item的部分,不知道为什么要用htmlentities函数去处理一下,我第一次没有发现,后来发现中文乱码的时候,才上网查询,最后把这个函数去掉了,直接显示$item,另外还要在oci_connect参数里加上编码参数ZHS16GBK(如果不行换编码,百度,我就不写了)。

    <?php
    
    $conn = oci_connect('username', 'password', '172.29.88.178/DBTEST');
    
    $stid = oci_parse($conn, 'select table_name from user_tables');
    oci_execute($stid);
    
    echo "<table>
    ";
    while (($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
        echo "<tr>
    ";
        foreach ($row as $item) {
            echo "  <td>".($item !== null ? htmlentities($item, ENT_QUOTES) : " ")."</td>
    ";
        }
        echo "</tr>
    ";
    }
    echo "</table>
    ";
    
    ?>

    访问这个页面就应该可以得到结果了。

    终极大坑:你可能执行上面的页面后发现没有任何东西显示,你可以在连接完的那一行后面显示一下oci的错误信息,具体用oci_error(),发现ora-24408 could not generate unique server group name是这个错误,百度了很久,找到了解决方法,/etc/sysconfig/network这里要配置HOSTNAME=主机名(主机名是自己起的名字),同时要在/etc/hosts里随后添加(127.0.0.1 localhost的后面,加个空格然后添加)主机名,然后重启网络service network restart,再去跑上面的测试文件,就OK了。

    总算是解决问题了,可能你在实际过程中又会遇到其他问题,还是不成功,我只能说,慢慢来,总会解决的,记得解决后把经验发上来,以供新(cai)手(niao)学习。

  • 相关阅读:
    【转】HTML CANVAS
    【转】JY 博客
    【转发】如何使用NPM?CNPM又是什么?
    【转廖大神】package.json 包安装
    【转】Socket接收字节缓冲区
    C# 串口操作系列(5)--通讯库雏形
    C# 串口操作系列(3) -- 协议篇,二进制协议数据解析
    C# 串口操作系列(4) -- 协议篇,文本协议数据解析
    .netCore微服务使用Nginx集中式管理实现
    nginx代理访问及上传文件异常413 Request Entity Too Large
  • 原文地址:https://www.cnblogs.com/wicub/p/6673160.html
Copyright © 2020-2023  润新知