在 Linux 和 Windows 上安装 PHP 和 Oracle Instant Client

针对 PHP 5.4 和 Oracle Database 11g 第 2 版进行了更新

作者:Christopher Jones

2012 年 4 月更新

配置 PHP 访问远程 Oracle 数据库的最简单方法是使用 Oracle Instant Client 库。本文介绍如何在 Windows 和 Linux 上安装具有 OCI8 扩展的 PHP 和 Oracle Instant Client。免费的 PHP 和 Oracle 秘笈介绍了其他安装选项并包含更多详细信息。

OCI8 是 PHP 扩展,用于连接到 Oracle 数据库。OCI8 是开源扩展并包括在 PHP 中。名称来源于首次在 Oracle Database 版本 8中引入的 Oracle 的 C“调用接口”API。OCI8 与 Oracle 客户端库(如 Oracle Instant Client)链接。

Oracle Instant Client 是一组可轻松安装的免费库,允许程序连接到本地或远程 Oracle 数据库实例。要使用 Instant Client,需要存在一个数据库 — Instant Client 不包括数据库。通常情况下,此数据库将位于其他计算机上。如果数据库为本地数据库,则 Instant Client 尽管方便且仍可用,但通常不需要,因为 OCI8 可以直接使用数据库的库。

使用 Instant Client 11g 时,PHP OCI8 连接到所有版本的 Oracle 9.2、10.x 和 11.x 数据库。

软件要求

软件 说明
Oracle Instant Client 下载“Basic”程序包。在 Linux 上,还应下载“SDK”或“devel”程序包。如果空间很宝贵,可以使用 Basic Lite 程序包代替 Basic。
Apache HTTP Server 版本 2.2
PHP 版本 5.4


在 Windows 上启用 PHP OCI8 扩展

Instant Client 二进制文件是 PHP 的 Windows 预构建二进制文件的补充。

  1. 安装 Apache,为此从 httpd.apache.org/download.cgi 下载 httpd-2.2.22-win32-x86-no_ssl.msi

  2. 双击 MSI 文件启动安装向导。

    安装“for All Users, on Port 80”。在默认目标文件夹中进行典型安装:C:\Program Files\Apache Software Foundation\Apache2.2

  3.  httpd.apache.org/download.cgi#mod_fcgid 下载 FastCGI 组件 mod_fcgid-2.3.6-win32-x86.zip

  4. 将此组件解压缩到已安装的 Apache 2.2 目录中。C:\Program Files\Apache Software Foundation\Apache2.2\modules 目录现在应该包含 mod_fcgid.so  mod_fcgid.pdb 文件。

  5. 编辑 C:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf 并添加以下代码行:

    LoadModule fcgid_module modules/mod_fcgid.so
  6.  httpd.conf 中,找到 htdocs 部分并将 ExecCGI 添加到 Options
    <Directory "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs">
    ...
    Options Indexes FollowSymLinks ExecCGI
    ...
    </Directory>
      
  7. 安装 PHP,为此从 windows.php.net/download 下载 PHP 5.4.0“VC9 x86 Non Thread Safe”ZIP 程序包 php-5.4.0-nts-Win32-VC9-x86.zip
  8. 在 Windows 资源管理器中,将 PHP 程序包解压缩到名为 C:\php-5.4.0 的目录中

     
  9.  C:\php-5.4.0 中,将 php.ini-development 复制到 php.ini

  10. 编辑 php.ini,进行以下更改:
    • 添加如下时区代码行:
      date.timezone = America/Los_Angeles


      使用您的本地时区名称。

    • 添加以下代码行:

      extension_dir = C:\php-5.4.0\ext


      这是包含 PHP 扩展的目录。

    • 删除以下代码行前的分号:

      extension=php_oci8_11g.dll
      
  11. 编辑 C:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf 并添加以下代码行。确保您使用正斜杠“/”而不是反斜杠“\”:

     

    FcgidInitialEnv PHPRC "c:/php-5.4.0"
    AddHandler fcgid-script .php
    FcgidWrapper "c:/php-5.4.0/php-cgi.exe" .php
    
  12.  OTN Instant Client 页面下载适用于 Windows 的“Instant Client 程序包 — Basic”。因为 PHP 是 32 位,所以使用 32 位版本的 Instant Client。

     

    将 Instant Client 文件解压缩到 C:\instantclient_11_2 

  13. 编辑 Windows PATH 环境设置并添加 C:\instantclient_11_2。例如,在 Windows XP 上,依次单击“开始”->“控制面板”->“系统”->“高级”->“环境变量”,在“系统变量”列表中编辑 PATH

    通常,您需要重新启动 Windows 以便正确设置新环境。

    设置所需的 Oracle 全球化语言环境变量,例如 NLS_LANG。如果不设置环境变量,则采用默认的本地环境。更多详细信息,请参见 PHP 和 Oracle 秘笈中“全球化”一章。

    取消设置 ORACLE_HOME  ORACLE_SID 等 Oracle 变量,Instant Client 不需要它们。

    如果您的计算机上还有其他 Oracle 软件,则编写可设置这些值的脚本并启动 Apache,而不是修改 Windows 环境。否则,可能因版本不同引发库符号冲突。

  14. 使用系统托盘中的 Apache Monitor 或“开始”菜单选项重新启动 Apache。

在 Linux 上启用 PHP OCI8 扩展

在 Linux 上,通常手动编译 PHP,因为捆绑的版本似乎从来不是最新的。但是,如果您不希望重新编译 PHP,可以从 oss.oracle.com 获得适用于 Oracle Linux 的更新的、不受支持的 RPM 程序包,或者通过 Unbreakable Linux Network 进行更新。如果需要支持的 PHP 环境,则使用 Zend Server。所有这些组件都预构建了 OCI8 扩展。

从源代码构建 PHP 和 OCI8:

  1. 安装 Apache HTTP Server 和开发程序包,例如,使用 yum install httpd httpd-devel

  2. 下载 PHP 5.4 源代码,并按照 PHP 手册中的Unix 系统上的安装来安装 PHP。

    在此阶段,不要配置 OCI8 扩展。

  3. 从 OTN Instant Client 页面下载 Basic 和 SDK Instant Client 程序包。可以使用 zip 文件或 RPM。

    以 root 用户身份安装 RPM,例如:

    rpm -Uvh oracle-instantclient11.2-basic-11.2.0.3.0-1.x86_64.rpm 
    rpm -Uvh oracle-instantclient11.2-devel-11.2.0.3.0-1.x86_64.rpm 
    

    第一个 RPM 将 Oracle 库放在 /usr/lib/oracle/11.2/client64/lib 中,第二个 RPM 在 /usr/include/oracle/11.2/client64 中创建头。

    如果您使用 ZIP 文件,应该将 SDK 解压缩到 basic 程序包所在的目录中,并手动创建符号链接:

    ln -s libclntsh.so.11.1 libclntsh.so
  4. PECL 中的最新 OCI8 扩展始终是当前版本。虽然此扩展通常与最新 PHP 5.4 源代码同步,但有时可以是更新的。可以使用以下语句自动下载最新生产扩展并将其添加到 PHP:

     

    pecl install oci8
    


    这会提供如下输出:

    downloading oci8-1.4.7.tgz ...
    Starting to download oci8-1.4.7.tgz (Unknown size)
    .....done: 168,584 bytes
    10 source files, building
    running: phpize
    Configuring for:
    PHP Api Version:         20100412
    Zend Module Api No:      20100525
    Zend Extension Api No:   220100525
    Please provide the path to the ORACLE_HOME directory.
    Use 'instantclient,/path/to/instant/client/lib' if you're compiling
    with Oracle Instant Client [autodetect] : 
    


    如果您具有 Instant Client RPM,按 Enter,PECL 将自动构建和安装 oci8.so 共享库。如果您具有 Instant Client zip 文件,或者想要使用特定版本的 Instant Client,则在“instantclient,”之后显式提供相应的路径:

    instantclient,/usr/lib/oracle/11.2/client64/lib
    

    使用显式绝对路径,因为 PECL 无法扩展环境变量。

    如果您没有 pecl 程序,也可以在浏览器中下载 OCI8 程序包并使用以下语句进行安装:

    tar -xzf oci8-1.4.7.tgz
    cd oci8-1.4.7
    phpize
    ./configure --with-oci8=instantclient,/usr/lib/oracle/11.2/client64/lib
    make install
    
  5. 编辑 php.ini 并使用以下语句启用 OCI8 扩展:
    extension=oci8.so


    还应确认 extension_dir 指向 oci8.so 文件的安装目录。

  6. 将 Instant Client 目录添加到 /etc/ld.so.conf,或者手动将 LD_LIBRARY_PATH 设置为 /usr/lib/oracle/11.2/client64/lib。您可能还要设置 Oracle 全球化语言环境变量,如 TNS_ADMIN  NLS_LANG。如果不设置 NLS_LANG,则采用默认的本地环境。更多详细信息,请参见 PHP 和 Oracle 秘笈中“全球化”一章。

    必须在启动 Apache 之前设置所有 Oracle 环境变量,以便正确初始化 OCI8 进程环境。在 PHP 脚本中设置环境变量可能导致明显或不明显的问题。在 Oracle Linux 上,导出 /etc/sysconfig/httpd 中的环境变量。在基于 Debian 的计算机上,在 /etc/apache2/envvars 中设置环境变量。

    重新启动 Apache,例如:

    service httpd restart


验证已安装 PHP OCI8 扩展

要检查 OCI8 配置,在 Apache 文档根目录中创建一个简单的 PHP 脚本 phpinfo.php

<?php
phpinfo();
?>


使用相应的 URL(例如 http://localhost/phpinfo.php)将此脚本加载到浏览器中。浏览器页面将包含“oci8”部分,其中显示“OCI8 Support enabled”并列出可以配置的 OCI8 选项。

连接到 Oracle 数据库

要创建连接,传递 Oracle 用户名和口令凭证作为 oci_connect() 的两个参数。Oracle 数据库名称连接标识符必须用于第三个参数,因为与 Instant Client 链接的程序始终被视为“远离”任何数据库服务器,并需要向这些程序告知要连接到的数据库实例。对于已建立的 Oracle 数据库,连接字符串可能是众所周知的。对于新系统,此信息由 Oracle 安装程序在安装数据库时提供。安装程序应该已经为您配置 Oracle 网络并创建服务名称,如 orcl

将连接信息传递给 PHP 有多种方法。此示例使用 Oracle 的简单连接语法连接到在 mymachine 上运行的 orcl 数据库服务中的 HR 模式。不需要 tnsnames.ora 或其他 Oracle 网络文件:

$conn = oci_connect('hr', 'hr_password', 'mymachine.mydomain/orcl');

有关简单连接语法,请参见 Oracle 的使用简单连接命名方法文档。

在新数据库中,需要解除对 HR 用户等演示模式的锁定并为其提供口令。也可通过在 SQL*Plus 中以 SYSTEM 用户身份连接并执行以下语句来完成此操作:

ALTER USER username IDENTIFIED BY new_password ACCOUNT UNLOCK;


使用 PHP OCI8 和 Oracle

试用简单的脚本 testoci.php 修改连接凭证以满足您的数据库要求,并将其加载到浏览器中。此示例列出了用户 HR 拥有的所有表:

<?php

$conn = oci_connect('hr', 'hr_password', 'mymachine.mydomain/orcl'); //两个斜杠ip/sid

$stid = oci_parse($conn, 'select table_name from user_tables');
oci_execute($stid);

echo "<table>\n";
while (($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
    echo "<tr>\n";
    foreach ($row as $item) {
        echo "  <td>".($item !== null ? htmlentities($item, ENT_QUOTES) : "&nbsp;")."</td>\n";
    }
    echo "</tr>\n";
}
echo "</table>\n";

?>


故障排除

查看 Apache 错误日志文件中是否存在启动错误。

临时在 php.ini 中设置 display_error=On,以便显示脚本错误。出于安全考虑,完成时将其切换回关闭状态。

PHP 和 Oracle 秘笈的第 9 章包含有关常见连接错误的信息,并讨论了备用的环境变量设置方法。

可以从 Instant Client 页面下载 Oracle 的 SQL*Plus 命令行工具来帮助解决环境问题和连接问题。检查 SQL*Plus 可以连接,然后确保 phpinfo.php 的 Environment 部分(而不是 Apache Environment 部分)显示相同的环境设置。

Windows 特定帮助

如果 phpinfo.php 脚本未生成显示“OCI8 Support enabled”的“oci8”部分,则确认已在 php.ini 中取消对 extension=php_oci8_11g.dll 的注释。

如果 php.ini 的 extension_dir 指令不包含具有 php_oci8_11g.dll 的目录,则启动 Apache 将显示以下警告:“PHP Startup:Unable to load dynamic library php_oci8_11g.dll.”

如果 PATH 设置错误或者根本找不到 Oracle 库,则启动 Apache 将显示以下警告:“The dynamic link library OCI.dll could not be found in the specified path.”phpinfo() 页面的 Environment 部分将显示 PATH 的值以及 PHP 实际使用的 Oracle 变量。

如果计算机上具有多个版本的 Oracle 库,则可能发生版本冲突。有关设置变量的一些讨论,请参见在 64 位 Windows 上使用 PHP OCI8 与 32 位 PHP

Linux 特定帮助

如果使用 Instant Client ZIP 文件,则确保将两个程序包解压缩到同一位置中。确保符号链接 libclntsh.so 指向 libclntsh.so.11.1

在启动 Apache 的 shell 中设置所有必要的 Oracle 环境变量。

总结

使用 Oracle Instant Client 以及通过 PECL 安装 PHP OCI8 可提供最大的灵活性,从而可轻松安装和升级组件。

可以在 OTN PHP  Instant Client 论坛上发布问题和建议。

PHP 开发人员中心包含指向有用背景资料的链接。

展开阅读全文

没有更多推荐了,返回首页