You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RHEL 8.9中PHP8通过HTTPD连接Oracle时OCIEnvNlsCreate()失败求助

问题:Red Hat 8.9上PHP8+OCI8连接Oracle失败

环境信息

  • Red Hat 8.9服务器
  • PHP8环境,已启用OCI8扩展
  • 已安装HTTPD Web服务器

连接代码

<?php
// Enable error reporting in PHP
error_reporting(E_ALL);
ini_set('display_errors', 1);

// Connect to the Oracle database using oci_connect
$conn = oci_connect("toakdbi", "toakdbi_123", "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=AvaniServer)(PORT=1521)))(CONNE_DATA=(SID=orcl)))");

if (!$conn) {
    $e = oci_error();
    echo "Connection failed: " . $e['message'];
} else {
    echo "</br>Connected to Oracle!";
}
?>

运行错误

Warning: oci_connect(): OCIEnvNlsCreate() failed. There is something wrong with your system - please check that LD_LIBRARY_PATH includes the directory with Oracle Instant Client libraries in /var/www/html/db2.php on line 10 
Warning: oci_connect(): Error while trying to retrieve text for error ORA-01804 in /var/www/html/db2.php on line 10 
Warning: Trying to access array offset on false in /var/www/html/db2.php on line 14
Connection failed:

相关配置文件内容

/etc/httpd/conf/httpd.conf

SetEnv LD_LIBRARY_PATH /home/oracle/Avani/dbhome_1/lib
SetEnv NLS_LANG American_America.UTF8
SetEnv PATH /usr/local/sbin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/home/oracle/Avani/dbhome_1/bin
PassEnv LD_LIBRARY_PATH

/etc/sysconfig/httpd

export LD_LIBRARY_PATH=/home/oracle/Avani/dbhome_1/lib
export ORACLE_HOME=/home/oracle/Avani/dbhome_1
export ORACLE_BASE=/home/oracle
export PATH=/usr/local/sbin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/home/oracle/Avani/dbhome_1/bin

~/.bashrc

# .bashrc   
# User specific aliases and functions   

export LD_LIBRARY_PATH=/home/oracle/Avani/dbhome_1/lib
export NLS_LANG=American_America.UTF8
export TNS_ADMIN=/home/oracle/Avani/dbhome_1/network/admin
export PATH=$PATH:$ORACLE_HOME/bin:$LD_LIBRARY_PATH:.
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi
export LD_LIBRARY_PATH=/home/oracle/Avani/dbhome_1/lib
export PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin:$PATH:$ORACLE_HOME/bin

~/.bash_profile

#.bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

export ORACLE_HOME=/home/oracle/Avani/dbhome_1
export ORACLE_SID=orcl

export LD_LIBRARY_PATH=/home/oracle/Avani/dbhome_1/lib
export NLS_LANG=American_America.UTF8
export TNS_ADMIN=/home/oracle/Avani/dbhome_1/network/admin
export PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin:$PATH:$ORACLE_HOME/bin:$PATH:.
# User specific environment and startup programs

export PATH

/etc/systemd/system/httpd.service.d/httpd.conf

[Service]
Environment="LD_LIBRARY_PATH=/home/oracle/Avani/dbhome_1/lib"
Environment="PATH=/usr/local/sbin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/home/oracle/Avani/dbhome_1/bin"

解决方案

1. 修复LD_LIBRARY_PATH的系统级加载与权限

Red Hat 8依赖systemd管理服务,需确保Apache用户能访问Oracle库文件:

  • 设置目录权限并将Apache加入Oracle用户组:
    chmod -R 755 /home/oracle/Avani/dbhome_1/lib
    chown -R oracle:oinstall /home/oracle/Avani/dbhome_1
    usermod -aG oinstall apache
    
  • 重载systemd配置并重启Apache:
    systemctl daemon-reload
    systemctl restart httpd
    

2. 修正连接字符串拼写错误

代码中CONNE_DATA为拼写错误,需改为CONNECT_DATA:

$conn = oci_connect("toakdbi", "toakdbi_123", "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=AvaniServer)(PORT=1521)))(CONNECT_DATA=(SID=orcl)))");

3. 验证OCI8扩展加载状态

创建phpinfo.php文件:

<?php phpinfo(); ?>

访问该文件,搜索oci8确认扩展已正常加载。

4. 测试Apache用户的Oracle客户端连接

切换到Apache用户,验证环境变量与连接有效性:

su - apache -s /bin/bash
export LD_LIBRARY_PATH=/home/oracle/Avani/dbhome_1/lib
export ORACLE_HOME=/home/oracle/Avani/dbhome_1
sqlplus toakdbi/toakdbi_123@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=AvaniServer)(PORT=1521)))(CONNECT_DATA=(SID=orcl)))

若sqlplus连接失败,先解决客户端配置问题,再回到PHP代码调试。

5. 清理冗余环境变量配置

多个文件重复设置LD_LIBRARY_PATH等变量易引发冲突,建议保留/etc/systemd/system/httpd.service.d/httpd.conf的配置,移除/etc/httpd/conf/httpd.conf中的SetEnv和PassEnv相关行。


内容的提问来源于stack exchange,提问作者iAmGroot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 02:50:54