php的oci_connect偶爾出現OCIEnvNlsCreate fail和缺失LD_LIBRARY_PATH的處理辦法

xingfei80發表於2011-08-30

使用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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章