php的oci_connect偶尔出现OCIEnvNlsCreate fail和缺失LD_LIBRARY_PATH的处理办法

使用php+oracle已经好几年了,不管是apache+php,还是nginx+fastcgi+phpfpm,每隔几天或者几周时间,服务器会出现php运行错误,信息如下:PHP 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 ...

意思是LD_LIBRARY_PATH的变量缺失了,导致oracle的库文件找不到。但是为什么运行好好地,然后突然就有这个错误了呢,一直搞不明白,只能把它当做php的一个bug了。

[@more@]

后来google baidu找了下,也有人有同样问题,有人的处理方法是LD_LIBRARY_PATHweb服务启动的时候加载进去。

我找了下apache2bin目录下有个envvars的文件,此文件正好在apachectl会被调用,就是设置环境变量的,打开envars文件可以看到

LD_LIBRARY_PATH="/usr/local/apache2/lib:$LD_LIBRARY_PATH"

export LD_LIBRARY_PATH

那么我把他改成

LD_LIBRARY_PATH="/usr/local/apache2/lib:/usr/local/instantclient_10_2:$LD_LIBRARY_PATH"

export LD_LIBRARY_PATH

看起来apache启动的时候LD_LIBRARY_PATH就包含了oracle库目录了,事实也是如此,如果用phpinfo查看的时候,可以看到environment里面的LD_LIBRARY_PATH确实是我们设置的样子。

不过这样子修改后,错误还是照样发生了。然后继续寻找原因,有人说需要在httpd.conf文件里面设置:

SetEnv LD_LIBRARY_PATH /usr/local/apache2/lib:/usr/local/instantclient_10_2

LoadModule php5_module modules/libphp5.so

而且SetEnv一定要在load php module之前。

然后我照样做了,然后在phpinfo里面可以看到apache enviroment里面的LD_LIBRARY_PATH也设成了想要的那样。

按照这样改后的好几天,错误一直没有发生!看来问题解决了。

上面是apache的处理方法,nginxphp-fpm的设置如下(php-fpm.conf):

$HOSTNAME

/usr/local/bin:/usr/bin:/bin

......

/usr/local/instantclient_10_2

/usr/local/instantclient_10_2

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14663377/viewspace-1054566/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/14663377/viewspace-1054566/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值