仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1093|回复: 19
打印 上一主题 下一主题

[学习教程] PHP网页编程之PHP缓存手艺完成

[复制链接]
再现理想 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-3 23:32:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
建议大家买一本书,而不光是在网上看一些零碎的资料,一本书毕竟会讲的系统一些,全面一些,而且印刷的书不受电脑的限制,但是建议在看书的时候最好旁边有电脑,这样可以很及时地上机实践。      发个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 | 只看该作者
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线  \\\\\\\'_\\\\\\\' ;
谁可相欹 该用户已被删除
5#
发表于 2015-2-27 13:27:28 | 只看该作者
其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎
第二个灵魂 该用户已被删除
6#
发表于 2015-3-2 21:24:17 | 只看该作者
环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。
若天明 该用户已被删除
7#
发表于 2015-3-7 04:56:32 | 只看该作者
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
莫相离 该用户已被删除
8#
发表于 2015-3-12 20:44:13 | 只看该作者
没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。
小魔女 该用户已被删除
9#
发表于 2015-3-20 02:14:34 | 只看该作者
我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:
乐观 该用户已被删除
10#
发表于 2015-3-22 03:42:55 | 只看该作者
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
飘飘悠悠 该用户已被删除
11#
发表于 2015-3-25 17:06:25 | 只看该作者
对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。
飘灵儿 该用户已被删除
12#
发表于 2015-4-1 02:35:46 | 只看该作者
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
老尸 该用户已被删除
13#
发表于 2015-4-1 22:41:01 | 只看该作者
使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的
兰色精灵 该用户已被删除
14#
发表于 2015-4-14 19:47:55 | 只看该作者
当然这种网站的会员费就几十块钱。
分手快乐 该用户已被删除
15#
发表于 2015-4-15 01:16:22 | 只看该作者
爱上php,他也会爱上你。
蒙在股里 该用户已被删除
16#
发表于 2015-4-23 12:19:04 | 只看该作者
如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,
再现理想 该用户已被删除
17#
 楼主| 发表于 2015-4-30 04:06:04 | 只看该作者
真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,
活着的死人 该用户已被删除
18#
发表于 2015-5-2 18:58:49 | 只看该作者
有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。
只想知道 该用户已被删除
19#
发表于 2015-5-6 19:09:36 | 只看该作者
当然这种网站的会员费就几十块钱。
精灵巫婆 该用户已被删除
20#
发表于 2015-5-7 10:34:47 | 只看该作者
本文当是我的笔记啦,遇到的问题随时填充
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 05:03

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表