|
源代码网推荐
最后,我们来定制一个应用,综合的来解释 PEAR 缓冲机制的整体框架。
我们定义一个叫做 MySQL_Query_Cache 的类,缓冲 SELECT 的查询结果。
我们首先定义类的变量:
<?php require_once "Cache.php";
class MySQL_Query_Cache extends Cache { var $connection = null; var $expires = 3600;
var $cursor = 0; var $result = array();
function MySQL_Query_Cache($container = "file", $container_options = array("cache_dir"=> ".", "filename_prefix" => "cache_"), $expires = 3600) { $this->Cache($container, $container_options); $this->expires = $expires; }
function _MySQL_Query_Cache() { if (is_resource($this->connection)) { mysql_close($this->connection); }
$this->_Cache(); } } ?>
在正式开始之前,我们需要一些辅助函数。
function connect($hostname, $username, $password, $database) { $this->connection = mysql_connect($hostname, $username, $password) or trigger_error("数据库连接失败!", E_USER_ERROR);
mysql_select_db($database, $this->connection) or trigger_error("数据库选择失败!", E_USER_ERROR); }
function fetch_row() { if ($this->cursor < sizeof($this->result)) { return $this->result[$this->cursor ]; } else { return false; } }
function num_rows() { return sizeof($this->result); } ?>
下面我们来看怎样缓冲:
<?php function query($query) { if (stristr($query, "SELECT")) { // 计算查询的缓冲标记 $cache_id = md5($query);
// 查询缓冲 $this->result = $this->get($cache_id, "mysql_query_cache");
if ($this->result == NULL) { // 缓冲丢失 $this->cursor = 0; $this->result = array();
if (is_resource($this->connection)) { // 尽可能采用 mysql_unbuffered_query()
if (function_exists("mysql_unbuffered_query")) {$result = mysql_unbuffered_query($query, $this->connection); } else {$result = mysql_query($query, $this->connection); }
// 取出所有查询结果 while ($row = mysql_fetch_assoc($result)) {$this->result[] = $row; }
// 释放 MySQL 结果资源 mysql_free_result($result); // 把结果缓冲 $this->save($cache_id, $this->result, $this->expires, "mysql_query_cache"); } } } else { // 没有查询结果,不需要缓冲 return mysql_query($query, $this->connection); } } ?>
例 3: 使用 MySQL 查询缓冲
<?php require_once "MySQL_Query_Cache.php";
$cache = new MySQL_Query_Cache(); $cache->connect("hostname", "username", "password", "database"); $cache->query("select * from table");
while ($row = $cache->fetch_row()) { echo "<p>"; print_r($row); echo "</p>"; } ?>
源代码网供稿. |