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

2019-03-3100:08:03后端程序开发Comments3,299 views字数 2187阅读模式

项目需求,需要去其他项目组的oracle数据库上面去定时的获取一些数据,在本地配置了一下连接都oracle的方法,踩过windows上配置的一个又一个的坑,终于完成了配置,在此分享一下,希望能够帮助到有需要的的人。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/11072.html

1.首先验证一下他们给的只读账号是否能够连接成功,需要在本地安装连接工具(PLSQL Developer)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/11072.html

2.配置PLSQL Developer连接需要下载oracle即时客户端(instantclient_11_2)工具,建立一个文件里面保存连接数据库的信息,放到工具的目录下。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/11072.html

oracle的客户端最好要与oracle的版本一致(一般不一致也没事儿的),问了dba,我们这里是的版本,去oracle官网下载对应的client,由于本地的phpstudy里面带的php都是32位版本的,担心会出现问题,就下载了和php版本位数相同的客户端(电脑系统是64的,和这个关系不大)。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/11072.html

解压客户端放到一个目录下,新建放到客户端文件夹的子目录下。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/11072.html

PHP7在windows配置远程连接Oracle数据库的方法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/11072.html

里面放入以下内容文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/11072.html

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

test_db是自己起的连接名字,IP替换为远程oracle的IP,service_name放数据库名字。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/11072.html

将客户端的目录加入到path路径下,方便连接PLSQL Developer。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/11072.html

增加系统变量ORACLE_HOME,保存客户端目录。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/11072.html

增加系统变量NLS_lANG,保存为SIMPLIFIED CHINESE_CHINA.ZHS16GBK,为解决读取编码问题。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/11072.html

安装PLSQL Developer后连接看看是否可以连接上即可。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/11072.html

3.开启php的oci扩展或者pdo_oci扩展,连接测试。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/11072.html

php7因为没有带php_oci_11g的扩展,需要自己安装获取去下载对应版本的dll文件,放到php的ext目录下,在中开启扩展。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/11072.html

在开启后可能会出现windows缺失文件。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/11072.html

PHP7在windows配置远程连接Oracle数据库的方法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/11072.html

这时候将上面客户端里面的文件拷贝到php的目录下即可。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/11072.html

启动php,查看PHPinfo里面应该会出现如下扩展:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/11072.html

PHP7在windows配置远程连接Oracle数据库的方法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/11072.html

尝试连接数据库文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/11072.html

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>> (ext\pdo_oci\)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的)。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/11072.html

有些人说把dll文件全部拷贝到system32下或者全部拷贝到php下等等说法。首先,不建议拷贝任何东西到c盘的目录下,本来就乱七八糟的,还因为自己一个小功能去里面放文件肯定是不合理的。哪里用到就放那里就好。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/11072.html

就像上面的缺失文件,因为是php在用,所以php会先在自己的目录下去搜索该文件,放到php目录下就好(当然放到system32下可能也是可以的)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/11072.html

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

PHP7在windows配置远程连接Oracle数据库的方法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/11072.html

这个文件还有个特点就是很大,里面封装了很多函数扩展什么的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/11072.html

现在就大功告成了,在此测试一下上面的PHP代码:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/11072.html

  • PDO形式打印连接类型(object(PDO)#1 (0) {
    })
  • 普通连接返回连接类型(resource(5) of type (oci8 connection))

总结:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/11072.html

不要轻信那些回答动辄拷贝到system32下,全部文件放到哪里哪里的,这样会导致系统目录混乱,到时候自己都找不到,即使解决了问题思路也不清晰,可能自己莫名其妙的解决了(其实没啥用)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/11072.html

补充:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/11072.html

在用php连接数据库的时候,使用到的是oracle的数据库名字应该是配置的sid,而不是数据库名字。有些配置的这俩是不一样的,一定要注意,要不是连接不上的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/11072.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/bc/11072.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定