• PHP7在windows上配置远程连接Oracle数据库的方法


    由于项目需求,需要去其他项目组的oracle数据库上面去定时的获取一些数据,在本地配置了一下连接都oracle的方法,踩过windows上配置的一个又一个的坑,终于完成了配置,在此分享一下,希望能够帮助到有需要的的人。

    1.首先验证一下他们给的只读账号是否能够连接成功,需要在本地安装连接工具(PLSQL Developer)

    2.配置PLSQL Developer连接需要下载oracle即时客户端(instantclient_11_2)工具,建立一个tnsnames.ora文件里面保存连接数据库的信息,放到工具的目录下。

    oracle的客户端最好要与oracle的版本一致(一般不一致也没事儿的),问了dba,我们这里是11.2.0.4.0的版本,去oracle官网下载对应的client,由于本地的phpstudy里面带的php都是32位版本的,担心会出现问题,就下载了和php版本位数相同的客户端(电脑系统是64的,和这个关系不大)。

    解压客户端放到一个目录下,新建tnsnames.ora放到客户端文件夹的子目录下。

    里面放入以下内容

    test_db=
      (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = IP)(PORT = 1521))
        )
        (CONNECT_DATA =
          (SERVICE_NAME = dbname)
        )
      )

     test_db是自己起的连接名字,IP替换为远程oracle的IP,service_name放数据库名字。

    将客户端的目录加入到path路径下,方便连接PLSQL Developer。

    增加系统变量ORACLE_HOME,保存客户端目录。

    增加系统变量NLS_lANG,保存为SIMPLIFIED CHINESE_CHINA.ZHS16GBK,为解决读取编码问题。

    安装PLSQL Developer后连接看看是否可以连接上即可。

    3.开启php的oci扩展或者pdo_oci扩展,连接测试。

    php7因为没有带php_oci_11g的扩展,需要自己安装获取去下载对应版本的dll文件,放到php的ext目录下,在php.ini中开启扩展。

    在开启后可能会出现windows缺失oci.dll文件。

    这时候将上面客户端里面的oci.dll文件拷贝到php的目录下即可。

    启动php,查看PHPinfo里面应该会出现如下扩展:

    尝试连接数据库

    try{
      // $conn = new PDO("oci:dbname=//IP:1521/dbname",'username','password');// PDO方式
       $conn = oci_connect('username','password',"(DEscriptION=(ADDRESS=(PROTOCOL =TCP)(HOST=IP)(PORT = 1521))(CONNECT_DATA =(SID=dbname)))");
       var_dump($conn);
       echo "连接成功";
    }catch(PDOException $e){
       echo ("Error:".$e->getMessage());
    }
    
    • PDO方式会抛出如下的异常(SQLSTATE[]: pdo_oci_handle_factory: <<Unknown>> (extpdo_ocioci_driver.c:642)2017-03-08+1)
    • 普通连接会报错(Warning: oci_connect(): OCIEnvNlsCreate() failed. There is something wrong with your system - please check that PATH includes the directory with Oracle Instant Client libraries)

    在windows上遇上这些问题不要慌,这时候既然确定自己已经安装好了扩展,那么肯定不是php的bug问题什么的(我看到有些去php官方提bug的)。

    有些人说把dll文件全部拷贝到system32下或者全部拷贝到php下等等说法。首先,不建议拷贝任何东西到c盘的目录下,本来就乱七八糟的,还因为自己一个小功能去里面放文件肯定是不合理的。哪里用到就放那里就好。

    就像上面的缺失oci.dll文件,因为是php在用,所以php会先在自己的目录下去搜索该文件,放到php目录下就好(当然放到system32下可能也是可以的)

    由于当时配置了好久,有点儿心烦,干脆我就直接把整个Client的文件拷贝到了php目录下,测试不再出现上面的错误,那么证明就是因为缺少了上面的某个文件导致的。我这里是nginx+phpcgi的形式。这时候如果把刚才拷贝到php目录下的文件删除的话,有些被用到肯定就不能删,经过测试,只有下面这个文件和刚才的oci.dll文件不能删除。

    这个文件还有个特点就是很大,里面封装了很多函数扩展什么的。

    现在就大功告成了,在此测试一下上面的PHP代码:

    • PDO形式打印连接类型(

      object(PDO)#1 (0) {
      }

    • 普通连接返回连接类型(resource(5) of type (oci8 connection))

    总结:

    不要轻信那些回答动辄拷贝到system32下,全部文件放到哪里哪里的,这样会导致系统目录混乱,到时候自己都找不到,即使解决了问题思路也不清晰,可能自己莫名其妙的解决了(其实没啥用)

    补充:

    在用php连接数据库的时候,使用到的是oracle的数据库名字应该是配置的sid,而不是数据库名字。有些配置的这俩是不一样的,一定要注意,要不是连接不上的。

  • 相关阅读:
    HDU4507 吉哥系列故事――恨7不成妻(数位dp)
    UCF Local Programming Contest 2017 G题(dp)
    ICPC Latin American Regional Contests 2019 I题
    UCF Local Programming Contest 2017 H题(区间dp)
    HDU2089 不要62
    AcWing1084 数字游戏II(数位dp)
    UCF Local Programming Contest 2017 F题(最短路)
    Google Code Jam 2019 Round 1A Pylons(爆搜+贪心)
    AcWing1083 Windy数(数位dp)
    Vue
  • 原文地址:https://www.cnblogs.com/wyzs/p/6516425.html
Copyright © 2020-2023  润新知