针对 PHP 5.4 和 Oracle Database 11g 第 2 版进行了更新
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 数据库。
软件要求
在 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 开发人员中心包含指向有用背景资料的链接。
分享到:
相关推荐
在本案例中,我们关注的是针对Windows 64位系统的版本,即"Instant Client for Microsoft Windows (x64)",具体版本号为12.2.0.1.0,压缩包文件名为"instantclient-basic-windows.x64-12.2.0.1.0.zip"。 **Oracle ...
Oracle Instant Client是Oracle公司提供的一款轻量级数据库连接器,用于在Linux x64平台上与Oracle数据库进行交互。"instantclient-basic-linux.x64-21.1.0.0.0.zip" 是该组件的特定版本,表示适用于64位Linux系统的...
标题中的“php安装扩展_instantclient11.2-_-basic_11.2.0.3.0_oracle_1.x86_64_安装扩展.zip”指的是在PHP环境中安装Oracle数据库的Instant Client 11.2版本,这是一个用于连接到Oracle数据库的轻量级客户端库。...
在Linux环境下为PHP安装Oracle扩展是一项常见的任务,特别是在需要与Oracle数据库进行交互的Web应用程序中。Oracle数据库以其稳定性、安全性和高性能而闻名,因此许多企业选择它作为后端存储。PHP作为广泛使用的...
总之,"oracle-instantclient11.2-devel-11.2.0.3.0-1.x86_64.zip"是一个专为64位Linux系统设计的Oracle Instant Client开发包,它为开发者提供了连接和操作Oracle数据库的必要工具和库,简化了开发环境的搭建,并...
5. **其他库文件**:如ocijdbc12.jar(Java JDBC驱动),odbcinst.ini(ODBC配置),ocijdbc12.dll(Windows上的JDBC驱动),以及用于其他编程语言的接口库,如PHP、Python等。 使用Oracle Instant Client,开发者...
Oracle Instant Client是Oracle公司提供的一款客户端软件,它允许开发者和系统管理员在本地计算机上与远程Oracle数据库进行通信。这个工具包含了一系列库文件,用于支持SQL*Plus、ODBC、JDBC、PHP和.NET等接口,...
在安装和使用Oracle Instant Client时,以下是一些关键知识点: 1. **安装路径**:通常,Instant Client被安装在系统的特定目录下,如 `/opt/oracle/instantclient_19_21`。 2. **环境变量设置**:需要设置 `LD_...
Oracle Instant Client是一款轻量级的数据库连接工具,用于在客户端计算机上快速建立与Oracle数据库服务器的连接,无需安装完整的Oracle数据库客户端。这个压缩包文件集合包含三个不同版本的Instant Client:10.2、...
在这个案例中,"instantclient12.1 x86_64"的RPM包将帮助在系统上安装Oracle Instant Client,而“php rpm 安装 oci 和pdo_oci”则意味着我们需要找到对应的PHP OCI8和PDO_OCI扩展的RPM包,以便PHP能够连接并操作...
标题中的"instantclient-basic-nt-19.22.0.0.0dbru"指的是适用于Windows NT(32位或64位)操作系统的Oracle Instant Client的基础版本,版本号为19.22.0.0.0。这个版本包含了运行大多数Oracle数据库应用所需的最小...
1. **连接功能**:Instant Client提供了oci、sqlnet、tnslistener等组件,允许应用程序通过ODBC、JDBC、PHP等接口连接到Oracle数据库,无需在客户端机器上安装完整的数据库服务。 2. **基本组件**:主要包括oci.dll...
Oracle Instant Client是一款轻量级的Oracle数据库连接工具,它允许应用程序在无需完整Oracle数据库客户端安装的情况下,与Oracle数据库服务器进行通信。这个“instantclient文件.rar”压缩包包含了实现这一功能所需...
2. 配置环境变量:在安装Oracle Instant Client后,你需要设置一些环境变量,如`LD_LIBRARY_PATH`(在Linux上)或`PATH`(在Windows上),以便PHP能找到Oracle的库文件。例如,在Linux上,你可能需要添加如下行到`~/...
在安装这些RPM包后,用户或开发人员将能够连接到远程Oracle数据库,执行SQL查询,开发和测试Oracle数据库驱动的应用程序。为了正确配置Instant Client,通常需要设置环境变量,如ORACLE_HOME指向安装目录,LD_...
例如,在Windows上,可以将`C:\path\to\instantclient_12_2`添加到用户或系统环境变量的PATH中。 - **设置LIBRARY_PATH**: 对于某些平台,如Linux,可能还需要设置`LD_LIBRARY_PATH`,使其指向`instantclient_12_2`...
2. **解压**:将下载的`.exe`(Windows)或其他平台的压缩包解压到一个指定的目录,通常建议选择一个不会被频繁更改的位置,如`C:\Oracle\InstantClient`。 3. **环境变量设置**:为了使系统能找到Oracle Instant ...
压缩包中的`oracle-instantclient11.2-basic-11.2.0.3.0-1.i386.rpm`、`oracle-instantclient11.2-sqlplus-11.2.0.3.0-1.i386.rpm`和`oracle-instantclient11.2-devel-11.2.0.3.0-1.i386.rpm`分别是Oracle Instant ...
总结,"instantclient-basic-windows.x64-12.1.0.2.0"是一个针对64位Windows系统的Oracle Instant Client版本,它为开发者提供了轻量级的数据库连接解决方案,支持多种编程接口,并具备良好的性能和资源管理能力。...
- 数据库连接:Instant Client提供了连接Oracle数据库的必要组件,如oci.dll(在Unix/Linux系统中为libclntsh.so)和其他相关库,使得用户能够通过ODBC、JDBC、PHP等接口进行连接。 - SQL*Plus支持:包含SQL*Plus...