因爲項目需求,須要去其餘項目組的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()); }
在windows上趕上這些問題不要慌,這時候既然肯定本身已經安裝好了擴展,那麼確定不是php的bug問題什麼的(我看到有些去php官方提bug的)。
有些人說把dll文件所有拷貝到system32下或者所有拷貝到php下等等說法。首先,不建議拷貝任何東西到c盤的目錄下,原本就亂七八糟的,還由於本身一個小功能去裏面放文件確定是不合理的。哪裏用到就放那裏就好。
就像上面的缺失oci.dll文件,由於是php在用,因此php會先在本身的目錄下去搜索該文件,放到php目錄下就好(固然放到system32下可能也是能夠的)
因爲當時配置了很久,有點兒心煩,乾脆我就直接把整個Client的文件拷貝到了php目錄下,測試再也不出現上面的錯誤,那麼證實就是由於缺乏了上面的某個文件致使的。我這裏是nginx+phpcgi的形式。這時候若是把剛纔拷貝到php目錄下的文件刪除的話,有些被用到確定就不能刪,通過測試,只有下面這個文件和剛纔的oci.dll文件不能刪除。
這個文件還有個特色就是很大,裏面封裝了不少函數擴展什麼的。
如今就大功告成了,在此測試一下上面的PHP代碼:
object(PDO)#1 (0) {
}
總結:
不要輕信那些回答動輒拷貝到system32下,所有文件放到哪里哪里的,這樣會致使系統目錄混亂,到時候本身都找不到,即便解決了問題思路也不清晰,可能本身莫名其妙的解決了(其實沒啥用)
補充:
在用php鏈接數據庫的時候,使用到的是oracle的數據庫名字應該是配置的sid,而不是數據庫名字。有些配置的這倆是不同的,必定要注意,要不是鏈接不上的。