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

请使用浏览器的分享功能分享到微信等