当前位置: 首页 > 图文教程 > 网络编程 > PHP > 通过缓存数据库结果提高PHP性能(2)

PHP
PHP 执行系统外部命令 system() exec() passthru()
最新的php 文件上传模型,支持多文件上传
php 静态页面中显示动态内容
数据库查询记录php 多行多列显示
谈PHP生成静态页面分析 模板+缓存+写文件
PHP 各种排序算法实现代码
PHP nl2br函数 将换行字符转成 <br>
php 分页原理详解
Discuz 模板语句分析及知识技巧
php win下Socket方式发邮件类
怎样去阅读一份php源代码
建站常用13种PHP开源CMS比较
php xml留言板 xml存储数据的简单例子
PHP 开源AJAX框架14种
PHP 替换模板变量实现步骤
PHP has encountered an Access Violation at 7C94BD02解决方法
php 正则匹配函数体
php 文件夹删除、php清除缓存程序
php download.php实现代码 跳转到下载文件(response.redirect)
PHP类(Class)入门教程

通过缓存数据库结果提高PHP性能(2)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 256 ::
收藏到网摘: n/a

创建通知处理程序

  现在,您可以创建一个通知处理程序,它将借助于上面介绍的 sendNotification 过程向客户端发送更改通知。来看一看“清单 2”中的 PL/SQL 过程 orders_nf_callback。

  清单 2. 处理对 OE.ORDERS 表所做更改的通知的通知处理程序

CREATE OR REPLACE PROCEDURE orders_nf_callback (ntfnds IN SYS.CHNF$_DESC) IS 
tblname VARCHAR2(60);
numtables NUMBER;
event_type NUMBER;
row_id VARCHAR2(20);
numrows NUMBER;
ord_id VARCHAR2(12);
url VARCHAR2(256) := 'http://webserverhost/phpcache/dropResults.php?order_no=';
BEGIN
event_type := ntfnds.event_type;
numtables := ntfnds.numtables;
IF (event_type = DBMS_CHANGE_NOTIFICATION.EVENT_OBJCHANGE) THEN
FOR i IN 1..numtables LOOP
tblname := ntfnds.table_desc_array(i).table_name;
IF (bitand(ntfnds.table_desc_array(i).opflags,
DBMS_CHANGE_NOTIFICATION.ALL_ROWS) = 0) THEN
numrows := ntfnds.table_desc_array(i).numrows;
ELSE
numrows :=0;
END IF;
IF (tblname = 'OE.ORDERS') THEN
FOR j IN 1..numrows LOOP
row_id := ntfnds.table_desc_array(i).row_desc_array(j).row_id;
SELECT order_id INTO ord_id FROM orders WHERE rowid = row_id;
sendNotification(url, tblname, ord_id);
END LOOP;
END IF;
END LOOP;
END IF;
COMMIT;
END;
/
  如“清单 2”所示,此通知处理程序将 SYS.CHNF$_DESC 对象用作参数,然后使用它的属性获取该更改的详细信息。在该示例中,此通知处理程序将只处理数据库为响应对注册对象进行的 DML 或 DDL 更改(也就是说,仅当通知类型为 EVENT_OBJCHANGE 时)而发布的通知,并忽略有关其他数据库事件(如实例启动或实例关闭)的通知。从以上版本开始,处理程序可以处理针对 OE.ORDERS 表中每个受影响的行发出的更改通知。在本文后面的“将表添加到现有注册”部分中,您将向处理程序中添加几行代码,以便它可以处理针对 OE.ORDER_ITEMS 表中被修改的行发出的通知。

  为更改通知创建注册

  创建通知处理程序后,必须为其创建一个查询注册。对于本示例而言,您必须在注册过程中对 OE.ORDER 表执行查询并将 orders_nf_callback 指定为通知处理程序。您还需要在 DBMS_CHANGE_NOTIFICATION 程序包中指定 QOS_ROWIDS 选项,以便在通知消息中启用 ROWID 级别的粒度。“清单 3”是一个 PL/SQL 块,它为 orders_nf_callback 通知处理程序创建查询注册。

  清单 3. 为通知处理程序创建查询注册
DECLARE 
REGDS SYS.CHNF$_REG_INFO;
regid NUMBER;
ord_id NUMBER;
qosflags NUMBER;
BEGIN
qosflags := DBMS_CHANGE_NOTIFICATION.QOS_RELIABLE +
DBMS_CHANGE_NOTIFICATION.QOS_ROWIDS;
REGDS := SYS.CHNF$_REG_INFO ('orders_nf_callback', qosflags, 0,0,0);
regid := DBMS_CHANGE_NOTIFICATION.NEW_REG_START (REGDS);
SELECT order_id INTO ord_id FROM orders WHERE ROWNUM<2;
DBMS_CHANGE_NOTIFICATION.REG_END;
END;
/
  本示例针对 ORDERS 表创建了一个注册,并将 orders_nf_callback 用作通知处理程序。现在,如果您使用 DML 或 DDL 语句修改 ORDERS 表并提交事务,则将自动调用 orders_nf_callback 函数。例如,您可能针对 ORDERS 表执行下列 UPDATE 语句并提交该事务:
UPDATE ORDERS SET order_mode = 'direct' WHERE order_id=2421; 
UPDATE ORDERS SET order_mode = 'direct' WHERE order_id=2422;
COMMIT;
  要确保数据库发布了通知来响应以上事务,您可以检查 nfresults 表:
SELECT TO_CHAR(operdate, 'dd-mon-yy hh:mi:ss') operdate, 
tblname, rslt_msg FROM nfresults;
  结果应如下所示:
OPERDATE TBLNAME RSLT_MSG 
--------------------- ----------- ---------
02-mar-06 04:31:28 OE.ORDERS Not Found
02-mar-06 04:31:29 OE.ORDERS Not Found
  从以上结果中可以清楚地看到,orders_nf_callback 已经正常工作,但未找到客户端脚本。在该示例中出现这种情况并不意外,这是因为您并未创建 URL 中指定的 dropResults.php 脚本。有关 dropResults.php 脚本的说明,请参阅本文后面的构建客户端 部分。