標籤:項目需求 ddr phpstudy failed 建議 service 編碼問題 director image
由於項目需求,需要去其他項目組的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>> (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下,全部檔案放到哪裡哪裡的,這樣會導致系統目錄混亂,到時候自己都找不到,即使解決了問題思路也不清晰,可能自己莫名其妙的解決了(其實沒啥用)
PHP7在windows上配置遠端連線Oracle資料庫的方法