PHP7在windows上配置遠端連線Oracle資料庫的方法

來源:互聯網
上載者:User

標籤:項目需求   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資料庫的方法

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.