|

楼主 |
发表于 2011-3-12 01:25:16
|
显示全部楼层
本帖最后由 qi_ruo 于 2011-3-12 02:43 编辑
4 缓存 -- 让页面飞起来
缓存包括页面缓存和数据库缓存两个方面,页面缓存上面已经介绍过,这里指的是数据库缓存类application/libraries/Stcache.php,先引用Saturn的一段注释:
一个简单的key-value文件缓存实现,非常适合缓存系统经常调用的(从数据库中提取的)一些数据,比如用户参数信息.为什么用户参数信息的存储不使用CI默认提供的DB缓存?因为CI提供的DB缓存的生成是以controller/method的形式生成,对于那些被多个控制器同时调用的公共数据,比如配置信息,采用DB缓存会生成同样内容的缓存文件。所以,我绝不是因为蛋疼而写了这个类。
整个缓存类有三个函数_file($key)用于设置缓存文件名,set($key, $data)用于把$data序列化并保存到相应文件,get($key)用于找到缓存文件,并取出文件中序列化串代表的对象。
我们来看一个使用的例子,在前台的视图文件中我们会看到setting_item()函数,比如head.php中的setting_item('blog_title');大概意思我们能猜出来,就是取出博客标题的意思,这个函数是在application/libraries/Common.php定义的。
setting_item():首先声明了一个静态数组,然后检查在这个数组中有没有需要查询的元素,如果没有的话则调用get_settings()函数引用赋值,再检查是否有该元素,如果有返回该元素的值,否则返回FALSE;(静态变量的好处是可以保留已查询的元素,比如在一个脚本里已经通过setting_item('blog_title')取出blog_title的值,那么第二次取blog_title的值时可以直接从保存在内存的静态变量取,而不需要数据库查询)
get_settings():首先声明了一个静态变量,如果这个变量还没有被设置,则加载stache类库,并调用get('settings')函数赋值,如果没有该缓存文件,则执行SQL查询生成关联数组,并通过set('settings', $settings)生成缓存文件,最后赋值给静态变量并返回;
所以查询一个设置值时,按照对“静态变量->缓存文件->数据库”的顺序进行查询,提高了性能。
stcache不仅能缓存设置值,前台页面的其他一些元素也可以缓存,比如页面导航栏st_plugins/navigation/Navigation.php,在输出导航栏时,首先检查是否存在'Widget::Navigation'缓存文件,只有在该文件不存在的时候,才进行SQL查询;在其他插件中我们都能看到stcache缓存类的使用。
缓存的好处是毋庸置疑的,但它的优点也是它的缺点,页面不能即时更新,比如你在后台修改了某个页面的标题,但不管怎么刷新,前台的导航栏显示的依旧是以前的标题,这时你可以手动删除缓存目录下的缓存文件,好在不用这么麻烦,在STBlog的后台的静态缓存页面有一个清除缓存的链接,点击一下就可以清除缓存了,我们来看一下这个文件admin/settings.php的cacheClear()函数,它依次调用utility类的两个函数clear_file_cache()和clear_db_cache()分别删除页面缓存和数据库缓存目录下的所有文件。
5 插件 -- 扩展博客功能的途径
关于插件的机制的理解及实现请参阅Saturn写的一篇日志 PHP中插件机制的一种实现方案
STBlog中的插件类存在于application/libraries/Plugin.php,在插件类的构造函数中实现调用utility类的get_active_plugins()函数获取已激活的插件数组,然后遍历这个数组,依次加载插件文件并初始化。此外还有三个函数,register()用于注册插件方法,check_hook_exist($hook)用于检查插件方法是否存在,trigger($hook)用于触发插件函数。
我们来看一个插件的实例:st_plugins/navigation/Navigation.php
1) 在Plugin类的构造函数中通过utility类的get_active_plugins()函数获取所有已激活的插件,并创建他们的实例;
2) 在每个插件类的构造函数中把插件函数注册到Plugin类的$_listeners成员变量中;如在Navigation插件类的构造函数中通过$plugin->register('Widget::Navigation', $this, 'render');把$_listeners['Widget::Navigation']['Navigation->render']设置为array(object(Navigation), 'render');
3) 当程序遇到$this->plugin->trigger()函数时,触发插件函数;如在themes/default/header.php视图文件中触发Navigation插件函数:$this->plugin->trigger('Widget::Navigation', '<li><a href="{permalink}">{title}</a></li>'); trigger()函数确定该触发函数是否已注册,并且在该插件对象中存在此函数时,使用call_user_func_array()调用此触发函数,在该例中将执行Navigation类的render()方法,该函数的功能是获取所有的页面,并把参数$format中的{permalink}和{title}置换成页面的缩略名和标题打印出来;
4) 激活与禁用插件
在admin/plugins.php的Plugins控制器的active方法中首先通过plugins_mdl的get($name)方法获取获取该插件的信息:如作者、版本等;再调用plugins_mdl的active($plugin)方法激活该插件:首先检查是否该插件已激活,如果没有的话,把该插件添加到已激活的插件数组中,并把它序列化保存在settings表的active_plugins项目中;禁用插件与此类似。
6 备份插件 -- 今天你备份了吗?
定期的给博客备份可以使我们发现服务器故障或数据丢失时不至于感到沮丧,一个最直接的方法就是用PHPMyAdmin的导出功能导出SQL文件,不过这有点麻烦,CodeIgniter的dbutil类可以帮助我们备份数据库,但仅在MySQL数据库时有效。
为了添加备份功能,我们可以添加一个控制器或者在某个已存在的控制器中加入一个方法,比如可以在Settings控制器中加入一个backup方法:PHP复制代码 public function backup (){
$this->load->dbutil();
$this->load->helper('download');
$backup =& $this->dbutil->backup();
$file_name = 'stblog-' . date('Y-m-d') . '.sql.gz';
force_download ($file_name, $backup);
} 复制代码 这样我们通过访问admin/settings/backup时就可以下载备份文件了。但如果使用插件来实现就更合适了,因为这样不仅不需要改变原控制器的结构,而且可以在需要备份的时候才激活插件,这样更加灵活。
STBlog自带的插件大多是在视图文件中用于显示内容的插件,那么怎样才能在控制器中没有backup函数但通过访问admin/settings/backup实现备份功能呢,我们可以从jeongee编写的STBlog新浪微博插件中得到一些启发,我们可以在settings控制器的构造函数中触发一个插件函数,用于检查URI的第三个参数是不是backup,如果不是继续执行下面的代码,否则运行插件函数里的代码。PHP复制代码 class Backup
{
private $_CI;
public function __construct (&$plugin)
{
$plugin->register('Backup::Backup', $this, 'backup');
$plugin->register('Backup: isplay', $this, 'display');
$this->_CI = &get_instance ();
}
// 用于备份的插件函数
public function backup ()
{
if ($this->_CI ->uri->segment(3) != 'backup') return;
$this->_CI ->load->dbutil();
$this->_CI ->load->helper('download');
$backup =& $this->_CI ->dbutil->backup();
$file_name = 'stblog-' . date('Y-m-d') . '.sql.gz';
force_download ($file_name, $backup);
}
// 用于显示备份链接的插件函数
public function display ($format)
{
echo str_replace('{backup}', anchor (site_url ('admin/settings/backup'), '备份数据库'), $format);
}
} 复制代码 在Settings控制器的构造函数中触发'Backup :: Backup'插件PHP复制代码 $this->auth->exeed('administrator');
$this->plugin->trigger('Backup::Backup'); 复制代码 在视图文件views/admin/dashboard的侧栏触发'Backup :: Display'插件PHP复制代码 <li> <?php echo anchor (site_url ('admin/settings/general'),'修改系统设置');?></li>
<?php $this->plugin->trigger('Backup: isplay', '<li>{backup}</li>');?> 复制代码 这样就可以显示一个备份的链接;在后台的插件管理中激活该备份插件就可以备份博客的SQL文件了。
附件是我编写的一个简单的备份插件,可以选择将备份文件本地下载或发送到指定邮箱,欢迎大家使用。
backup.rar
(1.39 KB, 下载次数: 63)
|
|