从上周开始,一直被一个问题困扰着,公司电脑上装的是Oracle9i客户端,然后使用Apache 2.2+php 5连接oracle数据库,不管如何配置都不能使用OCI
(使用oracle 10g的客户端只要去掉php.ini的php_oci8.dll的注释就会支持oci8,我笔记本电脑上是10g的客户端一点问题都没有.但因为一些其他原因不能把oracle9i卸载掉装10g)
从网上也找了很多资料去研读,网上有牛人给出了这样的解释.
PHP5的oci8不兼容oracle的 oci5.1.2以上引起的
php在设计时就是依赖于10,原因是他们认为在工作于8i兼容模式和让用户下载10的InstantClient两种取舍之间,选择了后者
会引起问题。
就是说如果要使PHP支持OCI连接Oracle数据库,就一定要依赖oracle client端版本10以上的函数库.
另外oracle网站上给出了这样的解决方法
http://www.oracle.com/technology/global/cn/pub/notes/technote_php_instant.html 中文版本
http://www.oracle.com/technology/pub/notes/technote_php_instant.html 英文版本
下载 PHP 二进制压缩文件(不是安装程序版本)和 Apache。按照 PHP 手册中的 Windows 系统上的安装安装它们。OTN 的开放源代码开发人员中心包含有用背景资料的链接,如“在 Windows 2000/XP 上安装 Oracle、PHP 和 Apache”,它介绍了如何安装传统、完整的 Oracle 10g 版本(Instant Client 不需要此版本)。
继续操作之前检查 PHP 是否正常运行。此阶段未启用 Oracle 支持。
从 OTN 的 Instant Client 页面下载用于 Windows 的 Instant Client Basic 程序包。此压缩文件的大小大约为 30MB。
创建一个子目录(例如,c:\instantclient10_1),然后从压缩文件中复制以下库:
- oraociei10.dll
- orannzsbb10.dll
- oci.dll
这三个文件的总大小大约为 80MB。
要使用 PHP 老版本的“oracle”扩展(在 php.ini 中使用“extension=php_oracle.dll”启用),则复制 ociw32.dll 而非 oci.dll。
编辑此环境,将 c:\instantclient10_1 添加到 PATH 中(位于其他 Oracle 目录之前)。
例如,在 Windows 2000 上,依次单击“开始”->“设置”->“控制面板”->“系统”->“高级”->“环境变量”,编辑系统变量列表中的 PATH。
如果使用了 tnsnames.ora 文件定义 Oracle Net 服务名称,则将 tnsnames.ora 复制到 c:\instantclient10_1,并将用户环境变量 TNS_ADMIN 设置为 c:\instantclient10_1。也可以在用户环境变量 LOCAL 中定义默认的服务名称。
设置必要的 Oracle 全球化语言环境变量,如 NLS_LANG。如果没有设置,则使用默认的本地环境。有关更多详细信息,请参见 Oracle PHP 应用程序全球化概述。
无需设置不必要的 Oracle 变量,如 ORACLE_HOME 和 ORACLE_SID。
编辑 php.ini,并不要将 OCI8 扩展设为注释:
extension=php_oci8.dll将 extension_dir 指令设置为完整的 PHP 扩展 DLL 路径。在 PHP 4 中,DLL 位于 PHP 软件的“extensions”子目录中。在 PHP 5 中,它们位于“ext”中。
重新启动 Apache。
要检查是否配置了扩展,请在 web 服务器可以读取的地方创建一个简单的 PHP 脚本。
<?php
phpinfo();
?>使用“http://”URL 将此脚本加载到浏览器中。浏览器页面应包含一个显示“OCI8 Support enabled”的“oci8”部分。
也许是小的愚钝,说实话我完完全全按照上面的步骤进行,还是不成功,环境变量设置好了也不支持.使用phpinfo()仍然没有oci8的部分出现.
打开命令提示符,到php的安装目录,输入php -v验证.出现
无法定位程序输入点OCIStmtPrepare2于动态链接库OCI.dll上
百思不得其解,明明配置好环境变量了,为什么仍旧不能定位到OCI.dll上?于是就把步骤3中的3个dll档copy到php的安装目录下,再一次的输入php -v,不再提示错误.
使用php脚本的phpinfo()验证还是不支持oci8.嗯,也许还是环境变量配置的问题吧.
于是就再一次的把步骤3中的3个dll档案copy到了apache的bin目录下.重启Apache,使用php脚本再一次验证,哇靠,终于出现oci8 support啦~
删除php安装目录下的3个dll档,.重启Apache,使用php脚本再一次验证,仍然支持oci8 support.
困扰了我一周多的问题解决.回顾一下,总结出配置的步骤如下
前提:Apache 2.2 +php 5.2.9已配置OK
Step 1: Instant Client 页面下载用于 Windows 的 Instant Client Basic 程序包,解压缩copy出
oraociei10.dll orannzsbb10.dll oci.dll 这个三个dll 档案到apache的bin目录下.
Step 2:去掉php.ini文件中php_oci8.dll前的注释,使PHP增加oci扩展功能.重新启动apache
Step 3:编写php脚本
<?php
phpinfo();
?>
使用“http://”URL 将此脚本加载到浏览器中。浏览器页面应包含一个显示“OCI8 Support enabled”的“oci8”部分。
Step 4:虽然开启了oci8支持,但要使客户端的NLS_LANG同数据库中的NLS_LANG相匹配,否则会出现另外一种错误ORA-12705: invalid or unknown NLS parameter value specified
客户端修改NLS_LANG :打开注册表HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE,找到NLS_LANG键值,原来的值为NA,修改为和服务器上的一样即可
设置环境变量的方法,理论上来说是正确的.但不适用于我的机器上,原因不明.在这里给出这样一种方法.权当参考.贻笑大方.