從上周開始,一直被一個問題困擾著,公司電腦上裝的是Oracle9i用戶端,然後使用Apache 2.2+php 5串連oracle資料庫,不管如何配置都不能使用OCI
(使用oracle 10g的用戶端只要去掉php.ini的php_oci8.dll的注釋就會支援oci8,我膝上型電腦上是10g的用戶端一點問題都沒有.但因為一些其他原因不能把oracle9i卸載掉裝10g)
從網上也找了很多資料去研讀,網上有牛人給出了這樣的解釋.
PHP5的oci8不相容oracle的 oci5.1.2以上引起的
php在設計時就是依賴於10,原因是他們認為在工作於8i相容模式和讓使用者下載10的InstantClient兩種取捨之間,選擇了後者
會引起問題。
就是說如果要使PHP支援OCI串連Oracle資料庫,就一定要依賴oracle client端版本10以上的函數庫.
另外oracle網站上給出了這樣的解決方案
http://www.oracle.com/technology/global/cn/pub/notes/technote_php_instant.html 中文版本
http://www.oracle.com/technology/pub/notes/technote_php_instant.html 英文版本
下載 PHP 二進位壓縮檔(不是安裝程式版本)和 Apache。按照 PHP 手冊中的 Windows 系統上的安裝安裝它們。OTN 的開放原始碼開發人員中心包含有用背景資料的連結,如“在 Windows 2000/XP 上安裝 Oracle、PHP 和 Apache”,它介紹了如何安裝傳統、完整的 Oracle 10g 版本(Instant Client 不需要此版本)。
繼續操作之前檢查 PHP 是否正常運行。此階段未啟用 Oracle 支援。
從 OTN 的 Instant Client 頁面下載用於 Windows 的 Instant Client Basic 程式包。此壓縮檔的大小大約為 30MB。
建立一個子目錄(例如,c:\instantclient10_1),然後從壓縮檔中複製以下庫:
- oraociei10.dll
- orannzsbb10.dll
- oci.dll
這三個檔案的總大小大約為 80MB。
要使用 PHP 老版本的“oracle”擴充(在 php.ini 中使用“extension=php_oracle.dll”啟用),則複製 ociw32.dll 而非 oci.dll。
編輯此環境,將 c:\instantclient10_1 添加到 PATH 中(位於其他 Oracle 目錄之前)。
例如,在 Windows 2000 上,依次單擊“開始”->“設定”->“控制台”->“系統”->“進階”->“環境變數”,編輯系統變數列表中的 PATH。
如果使用了 tnsnames.ora 檔案定義 Oracle Net 服務名稱,則將 tnsnames.ora 複製到 c:\instantclient10_1,並將使用者環境變數 TNS_ADMIN 設定為 c:\instantclient10_1。也可以在使用者環境變數 LOCAL 中定義預設的服務名稱。
設定必要的 Oracle 全球化語言環境變數,如 NLS_LANG。如果沒有設定,則使用預設的本地環境。有關更多詳細資料,請參見 Oracle PHP 應用程式全球化概述。
無需設定不必要的 Oracle 變數,如 ORACLE_HOME 和 ORACLE_SID。
編輯 php.ini,並不要將 OCI8 擴充設為注釋:
extension=php_oci8.dll
將 extension_dir 指令設定為完整的 PHP 擴充 DLL 路徑。在 PHP 4 中,DLL 位於 PHP 軟體的“extensions”子目錄中。在 PHP 5 中,它們位於“ext”中。
重新啟動 Apache。
要檢查是否配置了擴充,請在 網頁伺服器可以讀取的地方建立一個簡單的 PHP 指令碼。
<?php
phpinfo();
?>
使用“http://”URL 將此指令碼載入到瀏覽器中。瀏覽器頁面應包含一個顯示“OCI8 Support enabled”的“oci8”部分。
也許是小的愚鈍,說實話我完完全全按照上面的步驟進行,還是不成功,環境變數設定好了也不支援.使用phpinfo()仍然沒有oci8的部分出現.
開啟命令提示字元,到php的安裝目錄,輸入php -v驗證.出現
無法定位程式輸入焦點OCIStmtPrepare2於動態連結程式庫OCI.dll上
百思不得其解,明明配置好環境變數了,為什麼仍舊不能定位到OCI.dll上?於是就把步驟3中的3個dll檔copy到php的安裝目錄下,再一次的輸入php -v,不再提示錯誤.
使用php指令碼的phpinfo()驗證還是不支援oci8.嗯,也許還是環境變數配置的問題吧.
於是就再一次的把步驟3中的3個dll檔案copy到了apache的bin目錄下.重啟Apache,使用php指令碼再一次驗證,哇靠,終於出現oci8 support啦~
刪除php安裝目錄下的3個dll檔,.重啟Apache,使用php指令碼再一次驗證,仍然支援oci8 support.
困擾了我一周多的問題解決.回顧一下,總結出配置的步驟如下
前提:Apache 2.2 +php 5.2.9已配置OK
Step 1: Instant Client 頁面下載用於 Windows 的 Instant Client Basic 程式包,解壓縮copy出
oraociei10.dll
orannzsbb10.dll
oci.dll這個三個dll 檔案到apache的bin目錄下.
Step 2:去掉php.ini檔案中php_oci8.dll前的注釋,使PHP增加oci擴充功能.重新啟動apache
Step 3:編寫php指令碼
<?php
phpinfo();
?>
使用“http://”URL 將此指令碼載入到瀏覽器中。瀏覽器頁面應包含一個顯示“OCI8 Support enabled”的“oci8”部分。
Step 4:雖然開啟了oci8支援,但要使用戶端的NLS_LANG同資料庫中的NLS_LANG相匹配,否則會出現另外一種錯誤ORA-12705: invalid or unknown NLS parameter value specified
用戶端修改NLS_LANG :開啟註冊表HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE,找到NLS_LANG索引值,原來的值為NA,修改為和伺服器上的一樣即可
設定環境變數的方法,理論上來說是正確的.但不適用於我的機器上,原因不明.在這裡給出這樣一種方法.權當參考.貽笑大方.