Linux+ PHP + Oracle 开发部署踩坑记 之 oci_pconnect(): OCIEnvNlsCreate() failed

3 篇文章 0 订阅
2 篇文章 0 订阅

Linux+ PHP + Oracle 开发部署踩坑记 之 oci_pconnect(): OCIEnvNlsCreate() failed

    Date: 2020.9.26   阴天 . 有风 . 凉凉的

背景

手头有一个系统将PHP5.3升级到PHP7.4,但是需要同时使用两个PHP版本,于是乎就给Apache安装了fcgid模块。
安装之后部署PHP7.4的版本之后,出现了 oci_pconnect(): OCIEnvNlsCreate() failed 异常,出现这个的最主要原因是 PHP程序找不到环境中的ORACHE_HOME 和 LD_LIBRARY_PATH 设置,或者说这两种设置有误。

于是乎,排错方向有了!

排错方向1

校验当前环境的这两个值是否正确。

echo $ORACHE_HOME
echo $LD_LIBRARY_PATH

查看echo出来的值是否跟你环境中oracle的安装目录和oracle的库目录一致

解决方案:

cd ~ #进入当前用户目录
vim .bash_profile (or .bashrc)
--- 在末行加入 
	export ORACLE_HOME='/home/u01/app/oracle/product/11.2.0/db_1'(你的oracle_home路径)
	export LD_LIBRARY_PATH='/home/u01/app/oracle/product/11.2.0/db_1/lib'(你的library路径)
如果 ORACLE_HOME 和 LD_LIBRARY_PATH 已存在,修改成正确的路径即可
保存后执行
source ~/.bashrc(or .profile) 让环境变量生效

排错方向2

phpinfo(),直接搜索一下有没有ORACLE_HOME 和 LIBRARY 这两项的环境变量,并检查

解决方案:
php代码中设置环境变量

putenv('LD_LIBRARY_PATH=/home/u01/app/oracle/product/11.2.0/db_1/lib'); //此处要更改为你的oracle的lib路径
putenv('ORACLE_HOME=/home/u01/app/oracle/product/11.2.0/db_1');//此处要更改为你的oracle的路径
var_dump("LD_LIBRARY_PATH:",LD_LIBRARY_PATH);
var_dump("ORACLE_HOME:",ORACLE_HOME);

打印结果是有正确的配置的

排错方向3

在apache 的httpd里的httpd.conf 的项目配置里设置环境变量

<VirtualHost *:80>
        DocumentRoot /home/wwwroot/

        AddHandler fcgid-script .fcgi .php
        #映射fcgi执行脚本

        FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000
        #设置PHP_FCGI_MAX_REQUESTS大于或等于FcgidMaxRequestsPerProcess,防止php-cgi进程 在处理完所有请求前退出

        FcgidMaxRequestsPerProcess 1000
        #php-cgi每个进程的最大请求数

        FcgidIOTimeout 300
        #最大执行时间

        FcgidIdleTimeout 300
        #最大空闲时间

        FcgidMaxRequestLen 2097152
        #限制最大请求字节

        MaxRequestLen    52428800
        #php程序最大文件上传限制50MB,默认只有2MB

        FcgidInitialEnv PHPRC "/usr/local/php7.4.6/"
         #php安装路径

        FcgidWrapper "/usr/local/php7.4.6/bin/php-cgi" .php
        #php-cgi脚本执行路径

		# !!!!!!!!!!!!!! 此处设置 环境变量 !!!!!!!!!!!!!!!!
        SetEnv ORACLE_HOME "/home/u01/app/oracle/product/11.2.0/db_1"

        SetEnv LD_LIBRARY_PATH "/home/u01/app/oracle/product/11.2.0/db_1/lib:/lib:/usr/lib"
		# !!!!!!!!!!!!!! 此处设置 环境变量 !!!!!!!!!!!!!!!!
		
        <Directory "/home/wwwroot/">
        </Directory>

总结

排错方向基本上是查找ORACLE_HOME 和 LD_LIBRARY_PATH 环境变量设置是否正确,不正确就想办法让程序能获取到这两个变量的值。
小编用的是第三个排错方向才解决了问题,希望本文能帮助到你~

# 博客小菜鸟,记录日常,不喜尽情喷。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值