首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

Linux 下 PHP 安裝 Oracle OCI8 擴充模組完整教學

     編輯:PHP 綜合知識

PHP 連接 Oracle 必須安裝 Instant Client 基礎套件與 OCI8 擴充模組。本文記錄 CentOS/RHEL 環境下從 RPM 安裝到 PHP 整合的完整流程,並釐清版本對應、路徑配置、常見坑點。

版本對應鐵律

  • Instant Client 版本 必須等於或高於 目標 Oracle DB 版本(如 DB 10.2.0.4 → Client ≥ 10.2.0.4)。
  • 架構必須一致:64 位元 DB → 下載 x86_64 RPM;32 位元 → i386。
  • OCI8 PECL 版本對應 PHP 版本:PHP 5.3~5.6 用 oci8-1.4.x,PHP 7.0~7.1 用 oci8-2.0.x,PHP 7.2+ 用 oci8-2.1.x/2.2.x。

所需 RPM(以 Oracle 10.2.0.4 64-bit 為例)

oracle-instantclient-basic-10.2.0.4-1.x86_64.rpm
oracle-instantclient-devel-10.2.0.4-1.x86_64.rpm
oracle-instantclient-sqlplus-10.2.0.4-1.x86_64.rpm

安裝步驟

# 1. 安裝 Instant Client RPM
rpm -ivh oracle-instantclient-basic-10.2.0.4-1.x86_64.rpm \
           oracle-instantclient-devel-10.2.0.4-1.x86_64.rpm \
           oracle-instantclient-sqlplus-10.2.0.4-1.x86_64.rpm

# 安裝後庫檔通常在 /usr/lib/oracle/10.2.0.4/client64/lib/

# 2. 系統層依賴
yum install -y libaio gcc make

# 3. 下載並編譯 OCI8(PHP 5.3 範例)
cd /usr/local/src
wget https://pecl.php.net/get/oci8-1.4.10.tgz   # PHP 5.3~5.6 適用
tar zxvf oci8-1.4.10.tgz && cd oci8-1.4.10

# 關鍵:phpize 必須屬於目標 PHP
/usr/local/php5/bin/phpize

# 關鍵:configure 指定 Instant Client SDK 路徑
./configure \
  --with-php-config=/usr/local/php5/bin/php-config \
  --with-oci8=instantclient,/usr/lib/oracle/10.2.0.4/client64/lib

make && make install
# make install 輸出會顯示模組安裝路徑,例:
# Installing shared extensions: /usr/local/php5/lib/php/extensions/no-debug-zts-20090626/

php.ini 整合

; 建立獨立擴充目錄(方便管理)
extension_dir = "/usr/local/php5/lib/extensions"
; 或直接指向 make install 輸出路徑
; extension_dir = "/usr/local/php5/lib/php/extensions/no-debug-zts-20090626"

extension = oci8.so

; Oracle 環境變數(避免 ORA-12705 等字元集錯誤)
; 建議在 Apache 啟動腳本 /etc/profile.d/oracle.sh 設定
; export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
; export LD_LIBRARY_PATH=/usr/lib/oracle/10.2.0.4/client64/lib:$LD_LIBRARY_PATH

oci8.privileged_connect = On

環境變數永久生效(關鍵)

# 建立系統級設定檔
cat > /etc/profile.d/oracle.sh <<'EOF'
export ORACLE_HOME=/usr/lib/oracle/10.2.0.4/client64
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
EOF
chmod +x /etc/profile.d/oracle.sh
source /etc/profile.d/oracle.sh

# Apache 啟動腳本同步引入(或重啟前 source)
echo 'source /etc/profile.d/oracle.sh' >> /usr/local/apache2/bin/envvars

重啟驗證

/usr/local/apache2/bin/apachectl restart
# 瀏覽器開啟 info.php 搜尋 "oci8" 應看到支援資訊

常見錯誤與解決

錯誤原因解決
ORA-12154: TNS:could not resolve the connect identifier tnsnames.ora 未設定或路徑錯誤 建立 $ORACLE_HOME/network/admin/tnsnames.ora 或使用 Easy Connect 字串 host:port/service
ORA-12705: Cannot access NLS data files 字元集環境變數缺失 設定 NLS_LANG=.AL32UTF8 (注意前導點號)
ld.so: oci8.so: undefined symbol: OCISessionBegin Instant Client 版本與 OCI8 編譯期不符 重新編譯 OCI8,確認 --with-oci8 指向正確 SDK 路徑
PHP Warning: PHP Startup: Unable to load dynamic library 'oci8.so' LD_LIBRARY_PATH 未在 Apache 啟動前生效 在 /usr/local/apache2/bin/envvars 或 systemd unit 加入 Environment=LD_LIBRARY_PATH=...

PDO_OCI 替代方案

若專案使用 PDO,需額外編譯 pdo_oci:

cd /usr/local/src/php-5.3.21/ext/pdo_oci
/usr/local/php5/bin/phpize
./configure --with-php-config=/usr/local/php5/bin/php-config --with-pdo-oci=instantclient,/usr/lib/oracle/10.2.0.4/client64,10.2.0.4
make && make install
# php.ini 加入 extension=pdo_oci.so

總結

OCI8 安裝核心在於「版本對齊、路徑精準、環境變數早載入」。建議將上述步驟封裝為 Ansible/Shell 腳本納入基礎設施代碼,避免手動操作導致環境不一致。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved