使用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_PATH在web服务启动的时候加载进去。
我找了下apache2在bin目录下有个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的处理方法,nginx下php-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/