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
相关产品推荐
相关产品推荐

