作者:Christopher Jones
2012 年 4 月发布
本文介绍如何在 Oracle Linux 6 上安装并使用 PHP 脚本语言和 Oracle TimesTen In-Memory Database。文中介绍了 PHP OCI8 扩展,它既适用于 Oracle Database 也适用于 TimesTen Database。
市场营销描述最好地概述了 TimesTen:
Oracle TimesTen In-Memory Database (TimesTen) 是一个功能完备、经过内存优化的关系数据库,它具有持久性和可恢复性。它为应用程序提供了即时响应和极高的吞吐能力,可以满足数据库密集型应用程序的需要。TimesTen 部署在应用程序层,运行在完全装入物理内存 (RAM) 的数据库上。应用程序使用标准 SQL 接口访问 TimesTen 数据库。对于现有应用程序数据存放于 Oracle Database 中的客户,TimesTen 作为内存中缓存数据库来部署,可自动完成 TimesTen 与 Oracle Database 之间的数据同步。
大多数标准 PHP OCI8 特性也适用于 TimesTen,但 TimesTen 是不同于 Oracle Database 的另外一种数据库,因此对于有些 PHP OCI8 特性,不能期望它们按原来的方式工作,它们也许根本不能工作。特别是 PHP OCI8 提供的 LOB 支持不可用,尽管 TimesTen 11g 第 2 版现在允许存储 LOB。集合支持不可用,您在处理绑定时可能会遇到一些小问题,尤其在代码编得不怎么好时。错误消息有可能不同。如果将现有应用程序迁移到 TimesTen,那么彻底进行测试也很重要,因为 TimesTen 并非支持 Oracle Database 的全部 SQL、PL/SQL 和数据库特性。
按照 Oracle TimesTen In-Memory Database 11g 第 2 版 (11.2.2) 安装指南 安装 TimesTen。下面总结了使用 64 位 Oracle Linux 6.2 时的安装步骤:
useradd -m -c "TimesTen Owner" -d /home/ttadmin -s /bin/bash ttadmin chmod 755 /home/ttadmin passwd ttadmin
timesten
组并向其中添加 TimesTen 管理员和 Apache 用户: groupadd timesten usermod -a -G timesten ttadmin usermod -a -G timesten apache
mkdir /etc/TimesTen chgrp ttadmin /etc/TimesTen chmod 770 /etc/TimesTen/
ttadmin
用户身份登录。tar -xf timesten112220.linux8664.tar.gz
cd linux8664 ./setup.sh
除了 有关组和 QuickStart 的问题之外,均接受默认值。提示回答如下:
tt1122
/home/ttadmin
/home/ttadmin/TimesTen/tt1122/info
/home/ttadmin/TimesTen/tt1122/info
53396
ttadmin
组。(这不是默认选项)。将其限制于 timesten
组。TNS_ADMIN
,保留不设置53397
/home/ttadmin/TimesTen/tt1122/info
中创建 DemoDataStore
/etc/init.d
中: cd /home/ttadmin/TimesTen/tt1122/bin ./setuproot -install
TimesTen 现在开始运行。
/home/ttadmin/TimesTen/tt1122/quickstart/ttquickstartenv.sh
始终是一种在访问示例数据库之前设置 Oracle 环境变量的便捷方式。
通过设置环境和运行 ttstatus
命令检查实例的状态:
source /home/ttadmin/TimesTen/tt1122/quickstart/ttquickstartenv.sh
ttstatus
结果应为:
[ttadmin@localhost linux8664]$ ttstatus TimesTen status report as of Tue Apr 17 14:52:03 2012 Daemon pid 23629 port 53396 instance tt1122 TimesTen server pid 23638 started on port 53397 ------------------------------------------------------------------------ Accessible by group timesten End of report
有一个命令行工具可用来访问实例以运行即席查询:
ttisql "dsn=sampledb_1122;uid=appuser"
口令是 oracle
。
如果您需要手动停止或启动此 TimesTen 实例,请以 root
身份登录并运行:
service tt_tt1122 stop
或者
service tt_tt1122 start
如果您想删除该 TimesTen 实例,请先停止它,然后运行:
cd /home/ttadmin TimesTen/tt1122/bin/setup.sh -uninstall
创建示例数据库:
cd /home/ttadmin/TimesTen/tt1122/quickstart/sample_scripts/createdb ./build_sampledb.sh
adm
、appuser
和 xlauser
用户口令时,选择并记住口令。
安装 Apache 和 PHP:
yum install httpd php php-devel
/etc/php.ini
并使用相应的时区添加时区设置,例如: date.timezone = America/Los_Angeles
从 PECL 下载最新 OCI8 扩展并进行解压缩。然后:
tar -xf oci8-1.4.7.tgz cd oci8-1.4.7 phpize ./configure --with-oci8=instantclient,/home/ttadmin/TimesTen/tt1122/ttoracle_home/instantclient_11_2 make make install编辑
/etc/php.ini
并添加:extension=oci8.so
/etc/sysconfig/httpd
中设置: export TNS_ADMIN=/home/ttadmin/TimesTen/tt1122/network/admin/samples export LD_LIBRARY_PATH=/home/ttadmin/TimesTen/tt1122/lib:/home/ttadmin/TimesTen/tt1122/ttoracle_home/instantclient_11_2
如果您需要手动停止和重新启动 Apache,请使用 httpd
服务。由于安装 OCI8 时刚刚更改了配置,现在重新启动它:
service httpd restart
通过创建 /var/www/html/pi.php
文件测试 PHP:
<?php phpinfo(); ?>
在浏览器中使用 http://localhost/pi.php 进行加载。
您应得到有关 PHP 的配置信息的页面。检查存在 OCI8 部分。可以通过编辑 /etc/php.ini
并重新启动 Apache 更改配置选项。
前面给出的 ttisql
示例显示了示例凭证和连接字符串。可以在 PHP 脚本中使用这些来连接到 TimesTen。创建脚本 /var/www/html/oci8.php
:
<?php $c = oci_connect("appuser", "oracle", "sampledb_1122"); if (!$c) { $m = oci_error(); trigger_error('Could not connect to database: '. $m['message'], E_USER_ERROR); } $s = oci_parse($c, "select * from emp"); if (!$s) { $m = oci_error($c); trigger_error('Could not parse statement: '. $m['message'], E_USER_ERROR); } $r = oci_execute($s); if (!$r) { $m = oci_error($s); trigger_error('Could not execute statement: '. $m['message'], E_USER_ERROR); } echo "<table border='1'>\n"; while (($row = oci_fetch_array($s, 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"; ?>
使用 http://localhost/oci8.php 运行该脚本。查询结果将显示在表中。
如果您得到的是空白屏幕或出现问题,请检查 /var/logs/httpd/error_log
中的 Apache 日志。确保 SELinux 处于 Permissive 模式:
setenforce permissive service httpd restart
如果您使用的是命令行脚本或非永久性连接,则某些情况下,断开与 TimesTen 的连接可能较慢,这是因为在关闭与数据库的最后一个连接时要从 RAM 卸载数据库。可以通过使用 ttRamPolicySet
设置 RAM 策略来解决这一问题。对于 TimesTen 实例,此设置是持久性的。以下代码将最后一个应用程序断开连接之后数据库在 RAM 中保存的时间设置为 5 秒,这会延迟关闭数据库,从而让 PHP 应用程序能够毫无延迟地关闭连接:
$s = oci_parse($cc, "call ttRamPolicySet('inUse', 5)"); oci_execute($s);
PHP OCI8 扩展既适用于 Oracle Database 也适用于 TimesTen Database。许多基本脚本无需更改即可用于这两种数据库。但并非所有 PHP OCI8 或 Oracle Database 特性在 Oracle TimesTen 中都受到支持,因此建议小心测试应用程序。
在 PHP 和 Oracle 秘笈 中可以找到有关 OCI8 扩展的通用信息。
Christopher Jones 任职于 Oracle Linux 工程小组,他拥护 Oracle-PHP-Apache-Linux(“OPAL”)体系。