snake_l 发表于 2017-4-3 09:32:28

PHP Memcached + APC + 文件缓存封装

  使用方法:
  Memcached
  $cache = new Cache_MemCache();   
$cache->addServer('www1');   
$cache->addServer('www2',11211,20); // this server has double the memory, and gets double the weight   
$cache->addServer('www3',11211);   
// Store some data in the cache for 10 minutes   
$cache->store('my_key','foobar',600);   
// Get it out of the cache again   
echo($cache->fetch('my_key'));
  文件缓存
  $cache = new Cache_File();   
$key = 'getUsers:selectAll';   
// check if the data is not in the cache already   
if (!$data = $cache->fetch($key)) {   
// assuming there is a database connection   
$result = mysql_query("SELECT * FROM users");   
$data = array();   
// fetching all the data and putting it in an array   
while($row = mysql_fetch_assoc($result)) { $data[] = $row; }   
// Storing the data in the cache for 10 minutes   
$cache->store($key,$data,600);   
}
  class_cache3.php
  <?php   
abstract class Cache_Abstract {   
abstract function fetch($key);   
abstract function store($key, $data, $ttl);   
abstract function delete($key);   
}   
class Cache_APC extends Cache_Abstract {   
function fetch($key) {   
return apc_fetch($key);   
}   
function store($key, $data, $ttl) {   
return apc_store($key, $data, $ttl);   
}   
function delete($key) {   
return apc_delete($key);   
}   
}   
class Cache_MemCache extends Cache_Abstract {   
public $connection;   
function __construct() {   
$this->connection = new MemCache;   
}   
function store($key, $data, $ttl) {   
return $this->connection->set($key, $data, 0, $ttl);   
}   
function fetch($key) {   
return $this->connection->get($key);   
}   
function delete($key) {   
return $this->connection->delete($key);   
}   
function addServer($host, $port = 11211, $weight = 10) {   
$this->connection->addServer($host, $port, true, $weight);   
}   
}   
class Cache_File extends Cache_Abstract {   
function store($key, $data, $ttl) {   
$h = fopen($this->getFileName($key), 'a+');   
if (!$h)   
throw new Exception('Could not write to cache');   
flock($h, LOCK_EX);   
fseek($h, 0);   
ftruncate($h, 0);   
$data = serialize(array(time() + $ttl, $data));   
if (fwrite($h, $data) === false) {   
throw new Exception('Could not write to cache');   
}   
fclose($h);   
}   
function fetch($key) {   
$filename = $this->getFileName($key);   
if (!file_exists($filename))   
return false;   
$h = fopen($filename, 'r');   
if (!$h)   
return false;   
flock($h, LOCK_SH);   
$data = file_get_contents($filename);   
fclose($h);   
$data = @ unserialize($data);   
if (!$data) {   
unlink($filename);   
return false;   
}   
if (time() > $data) {   
unlink($filename);   
return false;   
}   
return $data;   
}   
function delete($key) {   
$filename = $this->getFileName($key);   
if (file_exists($filename)) {   
return unlink($filename);   
}   
else {   
return false;   
}   
}   
private function getFileName($key) {   
return '/tmp/s_cache' . md5($key);   
}   
}   
?>
页: [1]
查看完整版本: PHP Memcached + APC + 文件缓存封装