Oracle g Instant Client是PHP 与远程 Oracle 数据库连接的最简单方式它只需要安装三个库
PHP 访问 Oracle 的当前 API 所使用的 Instant Client 库称作 OCI(此 C 接口的名称最早是在 Oracle 中引入的)PHP Oracle 函数 可以直接调用 Oracle x 或 x或者也可以为了方便起见使用可选的抽象类如 PEAR MDB 和 ADOdb
Instant Client 也可以使用老版本的 PHPoracle扩展但它调用不赞成使用的 Oracle APIPHP 界或 Oracle 建议不要使用此扩展进行新的开发
要在 Apache 上将 Instant Client 与 PHP 或 连用请遵循以下步骤需要一个现有的 Oracle 数据库Instant Client 不提供 Oracle 数据库通常情况下此数据库将位于其他计算机上如果数据库位于本地则 Oracle 组件一般早已可用从而不需要 Instant Client
软件需求 软件 附注 Oracle Instant Client 下载Instant Client Package Basic
在 Linux 上还应下载Instant Client Package SDK Apache HTTPD Server PHP 界仍推荐 Apache PHP — PHP 超文本处理器 版或更高版本
在 Windows 上启用 PHP OCI 扩展
Instant Client 二进制文件是 PHP 的 Windows 预构建二进制文件的补充
下载 PHP 二进制压缩文件(不是安装程序版本)和 Apache按照 PHP 手册中的 Windows 系统上的安装安装它们OTN 的开放源代码开发人员中心包含有用背景资料的链接如在 Windows /XP 上安装 OraclePHP 和 Apache它介绍了如何安装传统完整的 Oracle g 版本(Instant Client 不需要此版本)
继续操作之前检查 PHP 是否正常运行此阶段未启用 Oracle 支持
从 OTN 的 Instant Client 页面下载用于 Windows 的 Instant Client Basic 程序包此压缩文件的大小大约为 MB
创建一个子目录(例如c:\instantclient_)然后从压缩文件中复制以下库
oraocieidll
orannzsbbdll
ocidll
这三个文件的总大小大约为 MB
要使用 PHP 老版本的oracle扩展(在 phpini 中使用extension=php_oracledll启用)则复制 ociwdll 而非 ocidll
编辑此环境将 c:\instantclient_ 添加到 PATH 中(位于其他 Oracle 目录之前)
例如在 Windows 上依次单击开始>设置>控制面板>系统>高级>环境变量编辑系统变量列表中的 PATH
如果使用了 tnsnamesora 文件定义 Oracle Net 服务名称则将 tnsnamesora 复制到 c:\instantclient_并将用户环境变量 TNS_ADMIN 设置为 c:\instantclient_也可以在用户环境变量 LOCAL 中定义默认的服务名称
设置必要的 Oracle 全球化语言环境变量如 NLS_LANG如果没有设置则使用默认的本地环境有关更多详细信息请参见 Oracle PHP 应用程序全球化概述
无需设置不必要的 Oracle 变量如 ORACLE_HOME 和 ORACLE_SID
编辑 phpini并不要将 OCI 扩展设为注释
extension=php_ocidll
将 extension_dir 指令设置为完整的 PHP 扩展 DLL 路径在 PHP 中DLL 位于 PHP 软件的extensions子目录中在 PHP 中它们位于ext中
重新启动 Apache
要检查是否配置了扩展请在 web 服务器可以读取的地方创建一个简单的 PHP 脚本
<?php phpinfo();?>
使用//URL 将此脚本加载到浏览器中浏览器页面应包含一个显示OCI Support enabled的oci部分
在 Linux 上启用 PHP OCI
扩展
要在 Linux 上添加 Oracle 连接需要重新编译 PHP
开放源代码开发人员中心包含有用背景资料的链接如在 Linux 上安装 OraclePHP 和 Apache它介绍了如何安装传统完整的 Oracle g 版本(Instant Client 不需要此版本)
下载并安装 Apache例如在您的主目录中安装它
cd apache_/configure enablemodule=so prefix=$HOME/apache withport=makemake install
编辑 $HOME/apache/conf/并添加
AddType application/xAddType application/xs
下载并解压缩 PHP
从 OTN 上的 Instant Client 页面下载 Basic 和 SDK Instant Client 程序包这两个 RPM 的总大小大约为 MB
以 root 用户的身份安装 RPM
rpm Uvh oracleinstantclientbasicirpmrpm Uvh oracleinstantclientdevelirpm
第一个 RPM 将 Oracle 库置于 /usr/lib/oracle//client/lib 中第二个 RPM 在 /usr/include/oracle//client 中创建头 (header)
备份此补丁然后将它应用于 PHP 的 ext/oci/configm该补丁的行号是基于 PHP 的如果已修复了 PHP 错误 (很有可能已在 PHP 和 中修复)则不需要此补丁
如果使用的是 PHP 或 则可以将此补丁保存到一个文件中(如 php_ociic_buildpatch)然后使用以下命令安装它
patch u configm php_ociic_buildpatch
此补丁创建一个新的 PHP 配置参数withociinstantclient[=DIR]在 Linux 上默认情况下它使用从 RPM 中安装的最新版本的 Instant Client可以指定 Oracle 库所在的目录来使用其他版本无论在哪种情况下都将自动使用正确的 SDK 头
新参数与现有的 withoci 参数互斥
例如在非 Linux 平台上将 Instant Client 程序包解压缩到您所选择的目录中withociinstantclient 参数将需要明确指定此目录例如withociinstantclient=/home/instantclient_应将 Instant Client SDK 解压缩到与基本程序包相同的目录中以便修改后的配置脚本可以找到头文件的子目录
在顶层 PHP 目录中重新构建configure脚本
cd phprm rf automtecache configcache/buildconf force
使用新选项运行 configure此示例使用安装在主目录中的 Apache
/configure \withociinstantclient \prefix=$HOME/php withapxs=$HOME/apache/bin/apxs \enablesigchild withconfigfilepath=$HOME/apache/conf
重建 PHP
makemake install
将 PHP 配置复制到 withconfigfilepath 指定的位置
cp phpinirecommended $HOME/apache/conf/phpini
将 LD_LIBRARY_PATH 设置为 /usr/lib/oracle//client/lib 并重新启动 Apache
如果使用了 tnsnamesora 文件定义 Oracle Net 服务名称则将 TNS_ADMIN 设置为包含此文件的目录
启动 Apache 之前应设置所有 Oracle 环境变量以下脚本可以帮助完成此操作
#!/bin/shAPACHEHOME=/home/apacheLD_LIBRARY_PATH=/usr/lib/oracle//client/lib:${LD_LIBRARY_PATH}TNS_ADMIN=/homeexport LD_LIBRARY_PATH TNS_ADMINecho Starting Apache $APACHEHOME/apachectl start
要确认是否配置了扩展请在 web 服务器可以读取的地方创建一个简单的 PHP 脚本
<?php phpinfo();?>
使用类似//localhost:/<path>/phpinfophp的 URL 将此脚本加载到浏览器中浏览器页面应包含一个显示OCI Support enabled的oci部分
连接到 Oracle
Oracle 连接信息被传递给 OCILogon() 来创建连接与 Instant Client 关联的工具通常远离任何数据库服务器因此必须将 Oracle Net 连接标识符与用户名和口令一起使用对于已建立的 Oracle 数据库连接信息有可能是众所周知的对于新系统此信息由 Oracle 安装程序在安装数据库时提供此安装程序应配置了 Oracle Net 和创建了一个服务名称
在新数据库中可能需要将演示模式(如 HR 用户)解除锁定并向其提供口令也可通过在 SQL*Plus 中以 SYSTEM 用户身份连接并执行以下语句来完成此操作
ALTER USER 用户名 IDENTIFIED BY 新口令 ACCOUNT UNLOCK;
将连接信息传递给 PHP 有多种方法第一个示例使用 Oracle g的 Easy Connect 语法连接到 在 mymachine 上运行的 MYDB 数据库服务中的 HR 模式不需要 tnsnamesora 或其他 Oracle Network 文件
$c = OCILogon(hr hr_password //mymachinemydomain/MYDB);
有关 Easy Connect 的语法请参见 Oracle 的使用 Easy Connect 命名方法文档
或者如果 /home/tnsnamesora 包含
MYDB =(DESCRIPTION=(ADDRESS = (PROTOCOL = TCP)(HOST = mymachinemydomain)(PORT = ))(CONNECT_DATA=(SERVER = DEDICATED)(SERVICE_NAME = MYDB) ) )
且 TNS_ADMIN 环境变量设置为 /home(在启动 Apache 之前)则连接字符串可以为
$c = OCILogon(hr hr_password MYDB);
如果环境变量 LOCAL(在 Windows 上)或 TWO_TASK (在 Linux 上)设置为 MYDB则可以使用以下代码生成与 MYDB 连接
$c = OCILogon(hr hr_password);
使用 Oracle
当基本连接可以使用时试着运行一个简单的脚本 testociphp根据您的数据库修改该连接的详细信息并在浏览器中加载它此示例列出了用户 HR 拥有的所有表
<?php $conn = OCILogon(hr hr_password //mymachinemydomain:port/MYDB);$query = select table_name from user_tables;$stid = OCIParse($conn $query);OCIExecute($stid OCI_DEFAULT);while ($succ = OCIFetchInto($stid $row)) {foreach ($row as $item) {echo $item ; }echo <br>\n; }OCILogoff($conn); ?>
故障诊断
Oracle PHP 故障诊断常见问题解答包含有关连接 Oracle 的有用信息
可以从 Instant Client 页面下载 Oracle 的 SQL*Plus 命令行工具来帮助解决环境问题和连接问题另请参见 SQL*Plus Instant Client 版本说明
检查 SQL*Plus 使用的环境是否与 phpinfophp 显示的环境相同
Windows 帮助
如果 phpinfophp 脚本没有生成显示OCI Support enabled的oci部分则确认在 phpini 中没有将extension=php_ocidll设为注释
如果 PATH 设置错误或找不到 Oracle 库则启动 Apache 将显示警告在指定的路径中找不到动态链接库 OCIdllphpinfo() 页面的 Environment 部分将显示 PATH 的值以及 PHP 实际使用的 Oracle 变量
如果 phpini 的 extension_dir 指令不正确则在启动 Apache 将显示警告PHP 启动无法加载动态库 php_ocidll
Linux 帮助
仔细检查是否正确修复了 configm如果configure失败则检查 configlog 文件还原 configm删除缓存文件运行 /buildconf force and configure验证问题是否与所做的更改相关
确保configure上的时间戳是当前的删除所有缓存文件并在必要时重建它
在启动 Apache 的 shell 中设置所有必要的 Oracle 环境变量
结论
希望本文对您能有所帮助您可以在 OTN Instant Client 或 PHP 论坛上发表问题和建议