oracle 擴展已棄用。php -v 正常。instantclient-basic-windows.x64-19.x.x.x.x.zip (或 11g/12c/18c 版本)。C:\instantclient_19_12,確認包含:oci.dll, oraociei19.dll, oraons.dll 等核心 DLL。C:\instantclient_19_12tnsnames.ora 放入上述目錄,設定用戶環境變數 TNS_ADMIN=C:\instantclient_19_12。NLS_LANG=TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950 (或 .AL32UTF8),避免中文亂碼。php.ini:extension=oci8 (PHP 7.2+ 無需 _12c 後綴)extension_dir = "C:\php\ext" (確認路徑正確)phpinfo() 確認出現 oci8 區塊且顯示 OCI8 Support enabled。yum install -y gcc make libaio-devel php-devel php-pear httpd-devel# 範例 19.12 版
rpm -Uvh oracle-instantclient19.12-basic-19.12.0.0.0-1.x86_64.rpm
rpm -Uvh oracle-instantclient19.12-devel-19.12.0.0.0-1.x86_64.rpm
安裝路徑:
庫檔:/usr/lib/oracle/19.12/client64/lib/
頭檔:/usr/include/oracle/19.12/client64/
pecl install oci8
# 互動提示輸入:instantclient,/usr/lib/oracle/19.12/client64/lib
或手動編譯:
cd /tmp
pecl download oci8
tar xzf oci8-*.tgz
cd oci8-*
phpize
./configure --with-oci8=instantclient,/usr/lib/oracle/19.12/client64/lib
make && make install編輯 /etc/sysconfig/httpd (或 apachectl 腳本) 加入:
export LD_LIBRARY_PATH=/usr/lib/oracle/19.12/client64/lib:$LD_LIBRARY_PATH
export TNS_ADMIN=/etc/oracle # 放置 tnsnames.ora 目錄
export NLS_LANG=TRADITIONAL_CHINESE_TAIWAN.AL32UTF8echo "extension=oci8.so" > /etc/php.d/oci8.ini
systemctl restart httpdphp -m | grep oci8 及 phpinfo()。// 1. Easy Connect (無需 tnsnames.ora)
$conn = oci_connect('hr', 'password', '//db-host:1521/ORCLPDB1');
// 2. TNS 別名 (需 TNS_ADMIN 指向 tnsnames.ora)
$conn = oci_connect('hr', 'password', 'MY_TNS_ALIAS');
// 3. 環境變數 TWO_TASK (Linux) / LOCAL (Windows) 設定預設連線
// export TWO_TASK=MY_TNS_ALIAS
$conn = oci_connect('hr', 'password');
<?php
$conn = oci_connect('hr', 'password', '//db-host:1521/ORCLPDB1');
if (!$conn) { $e = oci_error(); die(htmlentities($e['message'])); }
$stid = oci_parse($conn, 'SELECT table_name FROM user_tables');
oci_execute($stid);
echo "<table border=1><tr><th>TABLE_NAME</th></tr>";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
echo "<tr><td>".htmlentities($row['TABLE_NAME'])."</td></tr>";
}
echo "</table>";
oci_free_statement($stid);
oci_close($conn);
?>
| 現象 | 可能原因 | 解決 |
|---|---|---|
| phpinfo 無 oci8 區塊 | extension=oci8 被註解 / extension_dir 錯誤 | 檢查 php.ini、php -m、error_log |
| Apache 啟動報「找不到 oci.dll」 | PATH 未含 Instant Client 目錄 / 版位不匹配 (x86 vs x64) | 確認 PHP、Apache、Instant Client 皆為 64-bit;PATH 順序正確 |
| ORA-12545 / ORA-12560 | TNS_ADMIN 未設 / tnsnames.ora 格式錯 / 防火牆阻擋 | 用 tnsping 測試;檢查 Listener 狀態 |
| 中文亂碼 | NLS_LANG 未設或與資料庫字元集不符 | 設定 NLS_LANG 為資料庫字元集 (SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET') |
| OCI8 編譯失敗 | 缺少 SDK 頭檔 / phpize 版本不匹配 | 安裝 devel RPM;確認 php-devel 版本與 PHP 執行版本一致 |
Instant Client + OCI8 是 PHP 連接 Oracle 最輕量、效能最佳、維護最簡單的組合。關鍵在於:**統一 64-bit 架構、正確設定 PATH/LD_LIBRARY_PATH/TNS_ADMIN/NLS_LANG、善用 Easy Connect 簡化部署**。