针对 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 |
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
在 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
要检查 OCI8 配置,在 Apache 文档根目录中创建一个简单的 PHP 脚本 phpinfo.php:
<?php phpinfo(); ?>
使用相应的 URL(例如 http://localhost/phpinfo.php)将此脚本加载到浏览器中。浏览器页面将包含“oci8”部分,其中显示“OCI8 Support enabled”并列出可以配置的 OCI8 选项。
要创建连接,传递 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;
试用简单的脚本 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 开发人员中心包含指向有用背景资料的链接。