Linux下配置PHP5连接Oracle 10.2.0

发布于: 2008年06月16日

按惯例,必须先本地安装Oracle,至少是Oracle Client, 最好是全部服务器程序。安装Oracle 不在本文讨论范围。另外本文假设安装Oracle 10.2.0 全部服务器程序。

首先,编译安装PHP, 必须增加一条“–with-oci=/path/to/oracle”, 下面是我的PHP编译完整命令:

'./configure' '--prefix=/opt/php5' '--with-config-file-path=/opt/php5' '--with-bz2' '--with-exec-dir=/usr/bin/' '--with-curl' '--with-freetype-dir=/usr' '--with-png-dir=/usr' '--with-gd=shared' '--enable-gd-native-ttf' '--with-xml' '--with-jpeg-dir=/usr' '--with-openssl' '--with-zlib' '--with-pear=/usr/share/pear' '--with-mysql=shared,/usr' '--with-apxs2=/usr/sbin/apxs' '--with-oci8=/oracle/product/10.2.0'

其次,修改apache文件,识别oracle path。其中apache 识别php不再赘述。可以修改apache 的启动文件apachectl,找到下面文字
# |||||||||||||||||||| START CONFIGURATION SECTION ||||||||||||||||||||
# -------------------- --------------------
#
# the path to your httpd binary, including options if necessary
HTTPD='/usr/sbin/httpd'

在下面添加
export ORACLE_BASE=/oracle
export ORACLE_HOME=/oracle/product/10.2.0/
export PATH=$PATH:$ORACLE_HOME/BIN:
export LD_LIBRARY_PATH=/oracle/product/10.2.0/lib:$LD_LIBRARY_PATH

重启apache

最后,测试。写一个php 测试脚本,我的脚本如下:
检查phpinfo页面, 应该会有下面的文字

oci8

OCI8 Support enabled
Version 1.2.5
Revision $Revision: 1.269.2.16.2.43 $
Active Persistent Connections 0
Active Connections 0
Oracle Version 10.1
Compile-time ORACLE_HOME /oracle/product/10.2.0
Libraries Used no value
Temporary Lob support enabled
Collections support enabled

表示php 已经正查支持OCI8模块了。但并不保证能正查连接Oracle,只是说OCI8相关的函数可以使用而已。
//PHP连接Oracle函数
function php_conn_ora(){
$username='your username';
$passwd='your password';
$protocol='TCP';
$SERVICE_NAME='you service_name or SID';
$ORACLE_SERVER_IP_ADDRESS='your oracle ip';
$Port='1521';
PutEnv("NLS_LANG=SIMPLIFIED CHINESE_CHINA.AL32UTF8");
if(!$conn = oci_pconnect($username, $passwd, "(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = $protocol)(HOST = $ORACLE_SERVER_IP_ADDRESS)(PORT = $Port)) ) (CONNECT_DATA = (SERVICE_NAME = $SERVICE_NAME) ) )")) echo("Error in Connecting to DataBase");
return $conn;
}
//Query 函数
function ora_query($sql){
global $conn_ora;
$result=oci_parse($conn_ora,$sql);
oci_execute($result,OCI_DEFAULT);
return $result;
}
//Echo 环境变量
$ORACLE_HOME = getenv("ORACLE_HOME");
echo "ORACLE_HOME=$ORACLE_HOME
\n";
$LD_LIBRARY_PATH = getenv("LD_LIBRARY_PATH");
echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH
\n";
$PATH = getenv("PATH");
echo "PATH=$PATH
\n";
//连接测试
$conn_ora=php_conn_ora();
$sql="select * from sometable where rownum<=2";
$result=ora_query($sql);
oci_fetch_all($result,$array);
echo "<pre>";
var_dump($array);
echo "</pre>";

通过浏览器访问上面的脚本文件,如果一切正常,至少会有正常的环境变量结果输出,还有你的数据查询结果:

ORACLE_HOME=/oracle/product/10.2.0
NLS_LANG=AMERICAN_AMERICA.AL32UTF8
PATH=/usr/kerberos/sbin:/oracle/product/10.2.0/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/oracle/bin
//下面省略数据查询结果

异常处理:
这种事情一般很难一蹴而就,经常会有这样那样的问题。下面是我碰到过的情况:
测试页面包含下面提示文字:

...OCIEnvNlsCreate() failed. There is something wrong with your system - please check that ORACLE_HOME is set and points to the right directory...

解决办法:
1.检查测试脚本的环境变量输出是否正常。如果为:

ORACLE_HOME=
NLS_LANG=
PATH=

表示执行apache服务的用户没有得到正确环境变量。建议的解决办法是,将上面写入apachectl文件的文字:
export ORACLE_BASE=/oracle
export ORACLE_HOME=/oracle/product/10.2.0/
export PATH=$PATH:$ORACLE_HOME/BIN:
export LD_LIBRARY_PATH=/oracle/product/10.2.0/lib:$LD_LIBRARY_PATH

写道/etc/init.d/httpd文件试试,可以写到下面文字之后
apachectl=/usr/sbin/apachectl
httpd=${HTTPD-/usr/sbin/httpd}
prog=httpd
pidfile=${PIDFILE-/var/run/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd}
RETVAL=0

2.如果上面的显示正常,请检查oracle安装目录是否能为执行apache服务的用户读取。如果没有,请执行

chmod a+r /path/to/oracle

本文为寻找人生的起点(http://blog.cn-ic.org)原创,如需转载,请注明出处,并保留原文链接 http://blog.cn-ic.org/?p=94。

12 条评论

  1. I recommend to subscribe to RSS place in a conspicuous place! Readers will be more! Especially at a blog, how are you! Tested – a 30% increased the number of subscribers!

  2. 请问在freebsd下配置没配置过php连接oracle? 我这里怎么配都是连接不上

  3. Freebsd没有玩过。不过,一般来说,就是思路也是差不多吧:配置->测试->根据错误信息google->修改配置->测试, 如此反复。

  4. 请教一下php5连接oracle的时候报OCIEnvNlsCreate() failed. There is something wrong with your system – please check that ORACLE_HOME is set and points to the right directory这个错如何解决

  5. 文中有解决方案的哦。
    关键是测试脚本的环境变量是否输出正确信息。
    如果环境变量信息输出正常,且Oracle安装服务也在本机,可以尝试重启Oracle试试

  6. 您好! OCIEnvNlsCreate() failed. There is something wrong with your system – please check that ORACLE_HOME is set and points to the right directory 我也發生這個錯誤~
    然後測試腳本的環境變量就有錯誤,如下
    ORACLE_HOME= LD_LIBRARY_PATH=/usr/apache2/lib: PATH=/usr/sbin:/usr/bin
    接著我把把那一段環境變量加進apachectl or httpd
    卻變成伺服器無法打開,不能造訪網頁了
    請問這是怎麼回事@@
    謝謝您!

  7. export ORACLE_BASE=/oracle
    export ORACLE_HOME=/oracle/product/10.2.0/
    export PATH=$PATH:$ORACLE_HOME/BIN:
    export LD_LIBRARY_PATH=/oracle/product/10.2.0/lib:$LD_LIBRARY_PATH
    上面这段应该不会造成apache无法启动,除非字符是不是写错了。
    另外//Echo 环境变量那一段也很重要,如果echo出来的东西都是空的,说明变量没有真正生效,很有可能是用户的问题。比如apache执行的用户是httpd, 而变量生效的用户是本机的其他用户,需要好好检查一下。

    Good luck!

  8. 你好!
    結果我現在echo出來是正確的了,
    但是這個問題OCIEnvNlsCreate() failed. There is something…
    還是存在,
    接著我看用戶,我執行apache用戶是root,不管在root或者oracle用戶
    echo出來都是正確的,感覺權限也沒有問題
    這樣問題是出在哪??
    已經頭痛好幾天了@@

  9. 这样的话,只能怀疑Oracle 软件没有安装好,或者oralce软件安装目录apache执行用户没有x权限。
    将oracle 目录chmod -R 777 看看

  10. 我照楼主的方式做了,环境变量是空的,加了apachectl or httpd也是空的,想不明白,请楼主指教
    别外,export PATH=$PATH:$ORACLE_HOME/BIN:
    是否应为 export PATH=$PATH:$ORACLE_HOME/bin:

  11. 如果你在apachectl 或者 httpd两个文件里面都试过的话,按理说不应该这样。除非比如你的系统里面安装了两套apache, 而启动的那套没有用到你修改的配置文件。
    可以试试在上述文件中故意写错一行,看会不会报错。
    你后面的问题,根据你目录里面的实际情况写吧。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理

浙ICP备18056264号-1