配置Apache 2.2+PHP 5.2.9支持OCI通过Oracle9i Client连接Oracle

从上周开始,一直被一个问题困扰着,公司电脑上装的是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 英文版本

  1. 下载 PHP 二进制压缩文件(不是安装程序版本)和 Apache。按照 PHP 手册中的 Windows 系统上的安装安装它们。OTN 的开放源代码开发人员中心包含有用背景资料的链接,如“在 Windows 2000/XP 上安装 Oracle、PHP 和 Apache”,它介绍了如何安装传统、完整的 Oracle 10g 版本(Instant Client 不需要此版本)。

    继续操作之前检查 PHP 是否正常运行。此阶段未启用 Oracle 支持。

  2. 从 OTN 的 Instant Client 页面下载用于 Windows 的 Instant Client Basic 程序包。此压缩文件的大小大约为 30MB。

  3. 创建一个子目录(例如,c:\instantclient10_1),然后从压缩文件中复制以下库:

    • oraociei10.dll
    • orannzsbb10.dll
    • oci.dll

    这三个文件的总大小大约为 80MB。

    要使用 PHP 老版本的“oracle”扩展(在 php.ini 中使用“extension=php_oracle.dll”启用),则复制 ociw32.dll 而非 oci.dll。

  4. 编辑此环境,将 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。

  5. 编辑 php.ini,并不要将 OCI8 扩展设为注释:

    extension=php_oci8.dll

    将 extension_dir 指令设置为完整的 PHP 扩展 DLL 路径。在 PHP 4 中,DLL 位于 PHP 软件的“extensions”子目录中。在 PHP 5 中,它们位于“ext”中。

  6. 重新启动 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,修改为和服务器上的一样即可

  • 设置环境变量的方法,理论上来说是正确的.但不适用于我的机器上,原因不明.在这里给出这样一种方法.权当参考.贻笑大方.

    原文地址:https://www.cnblogs.com/fromchaos/p/1408097.html