PHP7在windows上配置遠程鏈接Oracle數據庫的方法

 

因爲項目需求,須要去其餘項目組的oracle數據庫上面去定時的獲取一些數據,在本地配置了一下鏈接都oracle的方法,踩過windows上配置的一個又一個的坑,終於完成了配置,在此分享一下,但願可以幫助到有須要的的人。php

1.首先驗證一下他們給的只讀帳號是否可以鏈接成功,須要在本地安裝鏈接工具(PLSQL Developer)nginx

2.配置PLSQL Developer鏈接須要下載oracle即時客戶端(instantclient_11_2)工具,創建一個tnsnames.ora文件裏面保存鏈接數據庫的信息,放到工具的目錄下。數據庫

oracle的客戶端最好要與oracle的版本一致(通常不一致也沒事兒的),問了dba,咱們這裏是11.2.0.4.0的版本,去oracle官網下載對應的client,因爲本地的phpstudy裏面帶的php都是32位版本的,擔憂會出現問題,就下載了和php版本位數相同的客戶端(電腦系統是64的,和這個關係不大)。windows

解壓客戶端放到一個目錄下,新建tnsnames.ora放到客戶端文件夾的子目錄下。php7

裏面放入如下內容oracle

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>> (ext\pdo_oci\oci_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,而不是數據庫名字。有些配置的這倆是不同的,必定要注意,要不是鏈接不上的。

相關文章
相關標籤/搜索