oracle 10g instant client(免費下載)是php 與遠程 oracle 數據庫連接的最簡單方式,它只需要安裝三個庫。
php 訪問 oracle 的當前 api 所使用的 instant client 庫稱作 oci8.(此 c 接口的名稱最早是在 oracle8 中引入的。)php oracle 8 函數 可以直接調用 oracle 8.1.7、9.x 或 10.x,或者也可以為了方便起見,使用可選的抽象類,如 pear mdb2 和 adodb。
instant client 也可以使用老版本的 php“oracle”擴展,但它調用不贊成使用的 oracle api。php 界或 oracle 建議不要使用此擴展進行新的開發。
要在 apache 上將 instant client 與 php 4 或 連用,請遵循以下步驟。需要一個現有的 oracle 數據庫;instant client 不提供 oracle 數據庫。通常情況下,此數據庫將位于其他計算機上。如果數據庫位于本地,則 oracle 組件一般早已可用,從而不需要 instant client。
軟件需求:
| 軟件 | 附注 |
| oracle instant client | 下載“instant client package - basic”。在 linux 上,還應下載“instant client package - sdk”。 |
| apache httpd server | php 界仍推薦 apache 1.3 |
| php — php 超文本處理器 | 4.3 版或更高版本 |
instant client 二進制文件是 php 的 windows 預構建二進制文件的補充。
下載 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),然后從壓縮文件中復制以下庫:
這三個文件的總大小大約為 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。
要檢查是否配置了擴展,請在 web 服務器可以讀取的地方創建一個簡單的 php 腳本。 phpinfo();
?>
使用“http://”url 將此腳本加載到瀏覽器中。瀏覽器頁面應包含一個顯示 “oci8 support enabled”的“oci8”部分。
在 linux 上啟用 php oci8 擴展
要在 linux 上添加 oracle 連接,需要重新編譯 php。
開放源代碼開發人員中心包含有用背景資料的鏈接,如在 linux 上安裝 oracle、php 和 apache,它介紹了如何安裝傳統、完整的 oracle 10g 版本(instant client 不需要此版本)。
cd apache_1.3.31./configure --enable-module=so--prefix=$home/apache
--with-port=8888makemake install
編輯 $home/apache/conf/httpd.conf 并添加:
addtype application/x-httpd-php .phpaddtype application/x-httpd-php-source .phps
下載并解壓縮 php。
從 otn 上的 instant client 頁面下載 basic 和 sdk instant client 程序包。這兩個 rpm 的總大小大約為 30mb。
以 root 用戶的身份安裝 rpm。
rpm -uvh oracle-instantclient-basic-10.1.0.3-1.i386.rpmrpm -uvh oracle-instantclient-devel
-10.1.0.3-1.i386.rpm
第一個 rpm 將 oracle 庫置于 /usr/lib/oracle/10.1.0.3/client/lib 中,第二個 rpm 在 /usr/include/oracle/10.1.0.3/client 中創建頭 (header)。
如果使用的是 php 4.3.9 或 4.3.10,則可以將此補丁保存到一個文件中(如 php_oci8ic_buildpatch),然后使用以下命令安裝它:
patch -u config.m4 php_oci8ic_buildpatch
此補丁創建一個新的 php 配置參數:--with-oci8-instant-client[=dir].在 linux 上,默認情況下,它使用從 rpm 中安裝的最新版本的 instant client??梢灾付?oracle 庫所在的目錄來使用其他版本。無論在哪種情況下,都將自動使用正確的 sdk 頭。
新參數與現有的 --with-oci8 參數互斥。
例如:在非 linux 平臺上,將 instant client 程序包解壓縮到您所選擇的目錄中。--with-oci8-instant-client 參數將需要明確指定此目錄;例如,--with-oci8-instant-client=/home/instantclient10_1。應將 instant client sdk 解壓縮到與基本程序包相同的目錄中,以便薷暮蟮吶渲媒瘧究梢哉業酵肺募淖幽柯肌?
cd php-4.3.9rm -rf autom4te.cache config.cache./buildconf --force
使用新選項運行 configure。此示例使用安裝在主目錄中的 apache。
./configure /--with-oci8-instant-client /--prefix=$home/php--with-apxs=$home/apache/bin/apxs
/--enable-sigchild --with-config-file-path=$home
/apache/conf
重建 php。
makemake install
將 php 配置復制到 --with-config-file-path 指定的位置
cp php.ini-recommended $home/apache/conf/php.ini
如果使用了 tnsnames.ora 文件定義 oracle net 服務名稱,則將 tns_admin 設置為包含此文件的目錄。
啟動 apache 之前應設置所有 oracle 環境變量。以下腳本可以幫助完成此操作:
#!/bin/shapachehome=/home/apacheld_library_path=/usr/lib/oracle/10.1.0.3/client/lib:
${ld_library_path}tns_admin
=/homeexport ld_library_path tns_adminecho
starting apache $apachehome/apachectl start
要確認是否配置了擴展,請在 web 服務器可以讀取的地方創建一個簡單的 php 腳本。 phpinfo();
?>
使用類似“http://localhost:8888/
oracle 連接信息被傳遞給 ocilogon() 來創建連接。與 instant client 關聯的工具通?!斑h離”任何數據庫服務器,因此必須將 oracle net 連接標識符與用戶名和口令一起使用。對于已建立的 oracle 數據庫,連接信息有可能是眾所周知的。對于新系統,此信息由 oracle 安裝程序在安裝數據庫時提供。此安裝程序應配置了 oracle net 和創建了一個服務名稱。
在新數據庫中,可能需要將演示模式(如 hr 用戶)解除鎖定并向其提供口令。也可通過在 sql*plus 中以 system 用戶身份連接并執行以下語句來完成此操作:
alter user 用戶名 identified by 新口令 account unlock;
將連接信息傳遞給 php 有多種方法。第一個示例使用 oracle 10g的 easy connect 語法連接到 在 mymachine 上運行的 mydb 數據庫服務中的 hr 模式。不需要 tnsnames.ora 或其他 oracle network 文件: $c = ocilogon('hr', 'hr_password', '//mymachine.mydomain/mydb');
有關 easy connect 的語法,請參見 oracle 的使用 easy connect 命名方法文檔。
或者,如果 /home/tnsnames.ora 包含: mydb =
(description=
(address = (protocol = tcp)(host = mymachine.mydomain)(port = 1521))
(connect_data=
(server = dedicated)
(service_name = mydb)
)
)
且 tns_admin 環境變量設置為 /home(在啟動 apache 之前),則連接字符串可以為:
$c = ocilogon('hr', 'hr_password', 'mydb');
如果環境變量 local(在 windows 上)或 two_task (在 linux 上)設置為 mydb,則可以使用以下代碼生成與 mydb 連接:
使用 oracle $c = ocilogon('hr', 'hr_password');
當基本連接可以使用時,試著運行一個簡單的腳本 testoci.php。根據您的數據庫修改該連接的詳細信息并在瀏覽器中加載它。此示例列出了用戶 hr 擁有的所有表: oracle php 故障診斷常見問題解答包含有關連接 oracle 的有用信息。 可以從 instant client 頁面下載 oracle 的 sql*plus 命令行工具來幫助解決環境問題和連接問題。另請參見 sql*plus instant client 版本說明。 檢查 sql*plus 使用的環境是否與 phpinfo.php 顯示的環境相同。
故障診斷 $conn = ocilogon("hr", "hr_password", '//mymachine.mydomain:port/mydb);$query = 'select table_name from user_tables';
$stid = ociparse($conn, $query);
ociexecute($stid, oci_default);
while ($succ = ocifetchinto($stid, $row)) {
foreach ($row as $item) {
echo $item." ";
}
echo "
/n";
}ocilogoff($conn);
?>
windows 幫助
如果 phpinfo.php 腳本沒有生成顯示“oci8 support enabled”的“oci8”部分,則確認在 php.ini 中沒有將“extension=php_oci8.dll”設為注釋。
如果 path 設置錯誤,或找不到 oracle 庫,則啟動 apache 將顯示警告:“在指定的路徑中找不到動態鏈接庫 oci.dll?!眕hpinfo() 頁面的 environment 部分將顯示 path 的值以及 php 實際使用的 oracle 變量。
如果 php.ini 的 extension_dir 指令不正確,則在啟動 apache 將顯示警告:“php 啟動:無法加載動態庫 php_oci8.dll?!?/span>
linux 幫助
仔細檢查是否正確修復了 config.m4。如果“configure”失敗,則檢查 config.log 文件。還原 config.m4,刪除緩存文件,運行 ./buildconf --force and configure,驗證問題是否與所做的更改相關。
確?!癱onfigure”上的時間戳是當前的。刪除所有緩存文件,并在必要時重建它。
在啟動 apache 的 shell 中設置所有必要的 oracle 環境變量。
結論希望本文對您能有所幫助。您可以在 otn instant client 或 php 論壇上發表問題和建議。
新聞熱點
疑難解答