再现理想 发表于 2015-2-3 23:32:31

PHP网页编程之PHP缓存手艺完成

建议大家买一本书,而不光是在网上看一些零碎的资料,一本书毕竟会讲的系统一些,全面一些,而且印刷的书不受电脑的限制,但是建议在看书的时候最好旁边有电脑,这样可以很及时地上机实践。      发个PHP缓存完成,完成了apc和文件缓存,承继Cache_Abstract便可完成挪用第三方的缓存东西。
  参考shindig的缓存类和apc。
  Php代码
  <?php
  class CacheException extends Exception {}
  /**
  * 缓存笼统类
  */
  abstract class Cache_Abstract {
  /**
  * 读缓存变量
  *
  * @param string $key 缓存下标
  * @return mixed
  */
  abstract public function fetch($key);
  /**
  * 缓存变量
  *
  * @param string $key 缓存变量下标
  * @param string $value 缓存变量的值
  * @return bool
  */
  abstract public function store($key, $value);
  /**
  * 删除缓存变量
  *
  * @param string $key 缓存下标
  * @return Cache_Abstract
  */
  abstract public function delete($key);
  /**
  * 清(删)除一切缓存
  *
  * @return Cache_Abstract
  */
  abstract public function clear();
  /**
  * 锁定缓存变量
  *
  * @param string $key 缓存下标
  * @return Cache_Abstract
  */
  abstract public function lock($key);
  /**
  * 缓存变量解锁
  *
  * @param string $key 缓存下标
  * @return Cache_Abstract
  */
  abstract public function unlock($key);
  /**
  * 获得缓存变量是不是被锁定
  *
  * @param string $key 缓存下标
  * @return bool
  */
  abstract public function isLocked($key);
  /**
  * 确保不是锁定形态
  * 最多做$tries次睡眠守候解锁,超时则跳过并解锁
  *
  * @param string $key 缓存下标
  */
  public function checkLock($key) {
  if (!$this->isLocked($key)) {
  return $this;
  }
  $tries = 10;
  $count = 0;
  do {
  usleep(200);
  $count ++;
  } while ($count <= $tries && $this->isLocked($key)); // 最多做十次睡眠守候解锁,超时则跳过并解锁
  $this->isLocked($key) && $this->unlock($key);
  return $this;
  }
  }
  /**
  * APC扩大缓存完成
  *
  *
  * @category Mjie
  * @package Cache
  * @author 流水孟春
  * @copyright Copyright (c) 2008-
  * @license New BSD License
  * @version $Id: Cache/Apc.php 版本号 2010-04-18 23:02 cmpan $
  */
  class Cache_Apc extends Cache_Abstract {
  protected $_prefix = 'cache.mjie.net';
  public function __construct() {
  if (!function_exists('apc_cache_info')) {
  throw new CacheException('apc extension didn\'t installed');
  }
  }
  /**
  * 保留缓存变量
  *
  * @param string $key
  * @param mixed $value
  * @return bool
  */
  public function store($key, $value) {
  return apc_store($this->_storageKey($key), $value);
  }
  /**
  * 读取缓存
  *
  * @param string $key
  * @return mixed
  */
  public function fetch($key) {
  return apc_fetch($this->_storageKey($key));
  }
  /**
  * 排除缓存
  *
  * @return Cache_Apc
  */
  public function clear() {
  apc_clear_cache();
  return $this;
  }
  /**
  * 删除缓存单位
  *
  * @return Cache_Apc
  */
  public function delete($key) {
  apc_delete($this->_storageKey($key));
  return $this;
  }
  /**
  * 缓存单位是不是被锁定
  *
  * @param string $key
  * @return bool
  */
  public function isLocked($key) {
  if ((apc_fetch($this->_storageKey($key) . '.lock')) === false) {
  return false;
  }
  return true;
  }
  /**
  * 锁定缓存单位
  *
  * @param string $key
  * @return Cache_Apc
  */
  public function lock($key) {
  apc_store($this->_storageKey($key) . '.lock', '', 5);
  return $this;
  }
  /**
  * 缓存单位解锁
  *
  * @param string $key
  * @return Cache_Apc
  */
  public function unlock($key) {
  apc_delete($this->_storageKey($key) . '.lock');
  return $this;
  }
  /**
  * 完全缓存名
  *
  * @param string $key
  * @return string
  */
  private function _storageKey($key) {
  return $this->_prefix . '_' . $key;
  }
  }
  /**
  * 文件缓存完成
  *
  *
  * @category Mjie
  * @package Cache
  * @author 流水孟春
  * @copyright Copyright (c) 2008-
  * @license New BSD License
  * @version $Id: Cache/File.php 版本号 2010-04-18 16:46 cmpan $
  */
  class Cache_File extends Cache_Abstract {
  public $useSubdir = false;
  protected $_cachesDir = 'cache';
  public function __construct() {
  if (defined('DATA_DIR')) {
  $this->_setCacheDir(DATA_DIR . '/cache');
  }
  }
  /**
  * 获得缓存文件
  *
  * @param string $key
  * @return string
  */
  protected function _getCacheFile($key) {
  $subdir = $this->useSubdir ? substr($key, 0, 2) . '/' : '';
  return $this->_cachesDir . '/' . $subdir . $key . '.php';
  }
  /**
  * 读取缓存变量
  * 为避免信息泄漏,缓存文件格局为php文件,并以""开首
  *
  * @param string $key 缓存下标
  * @return mixed
  */
  public function fetch($key) {
  $cacheFile = self::_getCacheFile($key);
  if (file_exists($cacheFile) && is_readable($cacheFile)) {
  // include 体例
  //return include $cacheFile;
  // 系列化体例
  return unserialize(@file_get_contents($cacheFile, false, NULL, 13));
  }
  return false;
  }
  /**
  * 缓存变量
  * 为避免信息泄漏,缓存文件格局为php文件,并以""开首
  *
  * @param string $key 缓存变量下标
  * @param string $value 缓存变量的值
  * @return bool
  */
  public function store($key, $value) {
  $cacheFile = self::_getCacheFile($key);
  $cacheDir = dirname($cacheFile);
  if(!is_dir($cacheDir)) {
  if(!@mkdir($cacheDir, 0755, true)) {
  throw new CacheException("Could not make cache directory");
  }
  }
  // 用include体例
  //return @file_put_contents($cacheFile, '
  return @file_put_contents($cacheFile, '' . serialize($value));
  }
  /**
  * 删除缓存变量
  *
  * @param string $key 缓存下标
  * @return Cache_File
  */
  public function delete($key) {
  if(emptyempty($key)) {
  throw new CacheException("Missing argument 1 for Cache_File::delete()");
  }
  $cacheFile = self::_getCacheFile($key);
  if(!@unlink($cacheFile)) {
  throw new CacheException("Cache file could not be deleted");
  }
  return $this;
  }
  /**
  * 缓存单位是不是已锁定
  *
  * @param string $key
  * @return bool
  */
  public function isLocked($key) {
  $cacheFile = self::_getCacheFile($key);
  clearstatcache();
  return file_exists($cacheFile . '.lock');
  }
  /**
  * 锁定
  *
  * @param string $key
  * @return Cache_File
  */
  public function lock($key) {
  $cacheFile = self::_getCacheFile($key);
  $cacheDir = dirname($cacheFile);
  if(!is_dir($cacheDir)) {
  if(!@mkdir($cacheDir, 0755, true)) {
  if(!is_dir($cacheDir)) {
  throw new CacheException("Could not make cache directory");
  }
  }
  }
  // 设定缓存锁文件的会见和修正工夫
  @touch($cacheFile . '.lock');
  return $this;
  }
  /**
  * 解锁
  *
  * @param string $key
  * @return Cache_File
  */
  public function unlock($key) {
  $cacheFile = self::_getCacheFile($key);
  @unlink($cacheFile . '.lock');
  return
可以在书上很方便地做标记,及时记下自己的心得体会。

admin 发表于 2015-2-4 01:42:41

php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。

透明 发表于 2015-2-6 21:59:29

先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。

山那边是海 发表于 2015-2-18 21:35:03

曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线\\\\\\\'_\\\\\\\' ;

谁可相欹 发表于 2015-2-27 13:27:28

其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎

第二个灵魂 发表于 2015-3-2 21:24:17

环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。

若天明 发表于 2015-3-7 04:56:32

不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。

莫相离 发表于 2015-3-12 20:44:13

没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。

小魔女 发表于 2015-3-20 02:14:34

我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:

乐观 发表于 2015-3-22 03:42:55

因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax

飘飘悠悠 发表于 2015-3-25 17:06:25

对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。

飘灵儿 发表于 2015-4-1 02:35:46

先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。

老尸 发表于 2015-4-1 22:41:01

使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的

兰色精灵 发表于 2015-4-14 19:47:55

当然这种网站的会员费就几十块钱。

分手快乐 发表于 2015-4-15 01:16:22

爱上php,他也会爱上你。

蒙在股里 发表于 2015-4-23 12:19:04

如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,

再现理想 发表于 2015-4-30 04:06:04

真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,

活着的死人 发表于 2015-5-2 18:58:49

有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。

只想知道 发表于 2015-5-6 19:09:36

当然这种网站的会员费就几十块钱。

精灵巫婆 发表于 2015-5-7 10:34:47

本文当是我的笔记啦,遇到的问题随时填充
页: [1]
查看完整版本: PHP网页编程之PHP缓存手艺完成