在 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 预构建二进制文件的补充。
- 安装 Apache,为此从 httpd.apache.org/download.cgi 下载
httpd-2.2.22-win32-x86-no_ssl.msi
- 双击 MSI 文件启动安装向导。安装“for All Users, on Port 80”。在默认目标文件夹中进行典型安装:
C:\Program Files\Apache Software Foundation\Apache2.2
。 - 从 httpd.apache.org/download.cgi#mod_fcgid 下载 FastCGI 组件
mod_fcgid-2.3.6-win32-x86.zip
- 将此组件解压缩到已安装的 Apache 2.2 目录中。
C:\Program Files\Apache Software Foundation\Apache2.2\modules
目录现在应该包含mod_fcgid.so
和mod_fcgid.pdb
文件。 - 编辑
C:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf
并添加以下代码行:LoadModule fcgid_module modules/mod_fcgid.so
- 在
httpd.conf
中,找到htdocs
部分并将ExecCGI
添加到Options
:<Directory "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs"> ... Options Indexes FollowSymLinks ExecCGI ... </Directory>
- 安装 PHP,为此从 windows.php.net/download 下载 PHP 5.4.0“VC9 x86 Non Thread Safe”ZIP 程序包 php-5.4.0-nts-Win32-VC9-x86.zip。
- 在 Windows 资源管理器中,将 PHP 程序包解压缩到名为
C:\php-5.4.0
的目录中 - 在
C:\php-5.4.0
中,将php.ini-development
复制到php.ini
- 编辑
php.ini
,进行以下更改:- 添加如下时区代码行:
date.timezone = America/Los_Angeles
使用您的本地时区名称。
- 添加以下代码行:
extension_dir = C:\php-5.4.0\ext
这是包含 PHP 扩展的目录。
- 删除以下代码行前的分号:
extension=php_oci8_11g.dll
- 添加如下时区代码行:
- 编辑
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
- 从 OTN Instant Client 页面下载适用于 Windows 的“Instant Client 程序包 — Basic”。因为 PHP 是 32 位,所以使用 32 位版本的 Instant Client。将 Instant Client 文件解压缩到
C:\instantclient_11_2
中 - 编辑 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 环境。否则,可能因版本不同引发库符号冲突。
- 使用系统托盘中的 Apache Monitor 或“开始”菜单选项重新启动 Apache。
在 Linux 上启用 PHP OCI8 扩展
在 Linux 上,通常手动编译 PHP,因为捆绑的版本似乎从来不是最新的。但是,如果您不希望重新编译 PHP,可以从 oss.oracle.com 获得适用于 Oracle Linux 的更新的、不受支持的 RPM 程序包,或者通过 Unbreakable Linux Network 进行更新。如果需要支持的 PHP 环境,则使用 Zend Server。所有这些组件都预构建了 OCI8 扩展。
从源代码构建 PHP 和 OCI8:
- 安装 Apache HTTP Server 和开发程序包,例如,使用
yum install httpd httpd-devel
。 - 下载 PHP 5.4 源代码,并按照 PHP 手册中的Unix 系统上的安装来安装 PHP。在此阶段,不要配置 OCI8 扩展。
- 从 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
- 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
- 编辑 php.ini 并使用以下语句启用 OCI8 扩展:
extension=oci8.so
还应确认 extension_dir 指向 oci8.so 文件的安装目录。
- 将 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'); $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) : " ")."</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 开发人员中心包含指向有用背景资料的链接。
参考:http://www.oracle.com/technetwork/cn/articles/dsl/technote-php-instant-090922-zhs.html
http://www.phperz.com/article/14/0823/19913.html
原文链接:php上安装连接oracle DB的扩展OCI8,转载请注明来源!