Linux下配置PHP5连接Oracle 10.2.0

来源:互联网 发布:arm linux 内核调试 编辑:程序博客网 时间:2024/06/10 20:03

Linux下配置PHP5连接Oracle 10.2.0

 


By simon ~ 六月 16th, 2008. Filed under: PHP, oracle, 服务器应用.

按惯例,必须先本地安装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 SupportenabledVersion1.2.5Revision$Revision: 1.269.2.16.2.43 $Active Persistent Connections0Active Connections0Oracle Version10.1Compile-time ORACLE_HOME/oracle/product/10.2.0Libraries Usedno valueTemporary Lob supportenabledCollections supportenabled

表示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。