2013-05-02 212 views
2

問題:Linux下的CentOS /的Oracle 11g/InstantClient/PHP 5.3.3的Oracle 11g PHP oci_connect失敗OCIEnvNlsCreate()

錯誤:oci_connect():OCIEnvNlsCreate()失敗。也有一些是錯誤的與您的系統 - 請檢查ORACLE_HOME和LD_LIBRARY_PATH設置,並指向正確的目錄

phpinfo()函數的相關章節:

enter image description here

enter image description here

enter image description here

正如你所看到的,環境變量是正確設置的,我可以用getenv()在頁面上回顯它們。我還檢查了讀取權限,我可以從網頁中讀取這些目錄中的所有文件。客戶端庫文件在那裏(我安裝並重新安裝兩次)完全安裝。這些庫是可讀和可加載的。

ldd沒有顯示任何錯誤。

這裏是php文件調用:

$test = getenv('LD_LIBRARY_PATH')." ".getenv('ORACLE_HOME'); 
$this->dbconn = oci_connect("myuser","mypassword", "localhost/orcl") or die("<b>Connection Failed: $test </b>").oci_error(); 

我嘗試了所有我從谷歌上搜索發現的招數,毫無效果。
任何幫助表示讚賞。

回答

4

Got OCIEnvNlsCreate()失敗?歡迎來到地獄......

我知道線程已經老了,但問題仍然存在。通常這個問題的答案會重定向到第三方網站,通常是404。

讓我們從問題開始。錯誤本身是非常通用的。其文件總結爲「庫崩潰......不知道爲什麼」。有各種各樣的解決方案,包括但不限於配置,重新安裝和祈禱「在這裏插入隨機的神名」。

這裏是最常見的解決方案的簡短列表:

1.將變量在你的PHP文件。

putenv("LD_LIBRARY_PATH=$newld"); 

where $newld is the link to your library. 

2.取出變量LD_LIBRARY_PATH,如果存在(是的,它是在1中所示的方式),從你的PHP文件,並將其放置到您apache2.conf或httpd.conf中或/ etc/environment或者你的發行版/版本對於環境變量的任何文件。一個簡單的指南可以找到here或在互聯網上的任何地方。爲什麼?

Do not set Oracle environment variables using putenv() in a PHP script because Oracle libraries may be loaded and initialized before your script runs. Variables set with putenv() may then cause conflicts, crashes, or unpredictable behavior. Some functions may work but others might give subtle errors. The variables should be set up before the web server is started.

如安裝文檔中所述。之後再重新啓動Apache。它是基於分佈/版本的,但最有可能的命令是service httpd restart

  1. 重新安裝oci8。儘可能多的時間。不要強迫它。強制只會讓事情變得更糟。此外,試圖編譯它(又名下載軟件包使用./configure -'all the fancy commands you'll need to use',然後make install)。

  2. 確保你得到正確的LD_LIBRARY_PATH。有趣的事情要說,對嗎?你可能沒有注意到,甲骨文在含有或多或少相同的文件,唯一的區別,它們之間的N個不同位置創建的文件夾client/lib/,是選擇所有,但這些文件夾中的一個將導致提到錯誤。完整性檢查?

  3. 重新安裝php/apache。這是可能的,你有一些導致問題出現,舊的安裝。因此,使用apt-get purge php*yum remove php*或任何做同樣的伎倆您的發行,將是一個良好的開端。

編輯 PHP升級後時又出現了問題,這時候有不同的解決方案。

  • EDIT SYSCONFIG編輯文件/ etc/SYSCONFIG/httpd的。添加這些2號線末:

    出口LD_LIBRARY_PATH = /路徑/ to.lib 出口ORACLE_HOME = /路徑/到/ home

  • 放棄並閱讀手冊可以發現here

  • 如果沒有這些東西的幫助,隨意瀏覽wall of sorrow,解決的辦法......

    +0

    我能夠解決這個問題,因爲導出/ etc/sysconfig/httpd中的env vars ORACLE_HOME和LD_LIBRARY_PATH,所以apache可以選擇它。 – 2016-12-02 01:35:46

    0

    我自己處理了這些相同的問題,除了在Ubuntu系統上。我們通過直接在/ etc/environment中設置環境變量並將它們從Apache配置中取出來解決它。只需在環境文件底部添加變量,它們將應用於系統範圍。

    +0

    感謝您的回覆,我嘗試過,但它沒有幫助我的情況。 – seedhom 2013-05-03 03:09:48

    2

    我也處理了這些同樣的問題我自己,我找到了解決辦法。

    在我的情況的解決方案是:

    1. 錯誤:錯誤:oci_connect():OCIEnvNlsCreate()失敗

    權限授予客戶端目錄和文件:

    sudo chmod -R 777 /usr/lib/oracle/11.2/client64 
    

    sudo chmod -R 777 /usr/include/oracle/11.2/client64 
    

    2.Error這是我後來得到:ORA-12546:TNS:許可被拒絕

    setsebool -P httpd_can_network_connect 1 
    

    的Apache將被授權連接數據庫。

    0

    在apache init腳本中添加您的自定義環境變量。 我使用的是centos,所以init腳本位於/ etc/init。d/httpd的

    簡單,複製您的oracle用戶的.bash_profile文件粘貼到/etc/init.d/httpd

    這是我的。

    ORACLE_HOSTNAME=ora11g.home.com; export ORACLE_HOSTNAME 
    ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE 
    ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1; export ORACLE_HOME 
    ORACLE_SID=ora11g; export ORACLE_SID 
    ORACLE_TERM=xterm; export ORACLE_TERM 
    PATH=$ORACLE_HOME/bin:/usr/sbin:$PATH; export PATH 
    LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; 
    export LD_LIBRARY_PATH 
    CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib; 
    export CLASSPATH 
    

    希望這有助於

    0

    我只是解決了這個同樣的問題:

    • 阿帕奇
    • CentOS的7
    • PHP 5
    • 甲骨文12cR1

    有消息稱:

    please check that ORACLE_HOME and LD_LIBRARY_PATH are set and point to the right directories

    在Apache中,有一個文件,你可以設置環境變量: /etc/sysconfig/httpd。必須有一個用於nginx的配置文件。

    我添加了所需的環境變量。 假設

    • ORACLE_HOME是/oracle/product/12.1.0/dbhome_1
    • Oracle客戶程序下/oracle/product/12.1.0/client

    添加安裝:

    ORACLE_HOME=/oracle/product/12.1.0/dbhome_1 
    LD_LIBRARY_PATH=/oracle/product/12.1.0/dbhome_1/lib:/oracle/product/12.1.0/dbhome_1/network/lib:/oracle/product/12.1.0/client/lib 
    

    我還補充說:

    TNS_ADMIN=/oracle/product/12.1.0/dbhome_1/network/admin 
    ORACLE_SID=<your sid> 
    

    更新/etc/sysconfig/httpd我只是重新啓動Apache的服務的httpd,那就是它之後:

    $ sudo systemctl restart httpd 
    

    我希望它能幫助!