zoukankan      html  css  js  c++  java
  • 配置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,修改为和服务器上的一样即可

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

  • 相关阅读:
    Leetcode 121. Best Time to Buy and Sell Stock
    Leetcode 120. Triangle
    Leetcode 26. Remove Duplicates from Sorted Array
    Leetcode 767. Reorganize String
    Leetcode 6. ZigZag Conversion
    KMP HDU 1686 Oulipo
    多重背包 HDU 2844 Coins
    Line belt 三分嵌套
    三分板子 zoj 3203
    二分板子 poj 3122 pie
  • 原文地址:https://www.cnblogs.com/fromchaos/p/1408097.html
Copyright © 2011-2022 走看看