| 
| 技术资料  > PHP技术 > 经典文章 : 采用 PEAR 来缓冲 PHP 程序(二) |  
采用 PEAR 来缓冲 PHP 程序(二) March 23,2004 |  
最后,我们来定制一个应用,综合的来解释 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>’; 
} 
?>  
<全文完> |  
 
 |