blog系统架构分析
参考网上http://www.wmhfly.com/php/my-blog-system-analysis.html 的架构,我的目标就是实现类似的路径seo.
最初,我开发时考虑到的几个问题:
1、用什么数据库?旧版的access,是否继续保留?
2、是否使用开源框架?是否使用模版引擎?
3、全站静态化?还是部分静态化?
4、目录结构和站点uri的规划,站点SEO优化,标签Tag的管理,构造一个api接口
面对这些问题,我纠结,但还是必须要做出选择。数据库的选择依据是可以携带行,不需要安装,文件形式的。所以我就选择Sqlite轻量级数据库,自php5开始,php就不再默认是mysql了,而是Sqlite数据库。当然也是看重Sqlite的优势,免费开源,跨平台,不依赖其他库,可达2T容量,比access的2G强,可负担10W点击率,能和php搭配的更完美,对于简单的web应用来说,用Sqlite数据库足够了。
至于框架和模版引擎,如果用一些MCV框架来架构,在整合模版引擎的话,那样太小题大作了。只是一个简单的blog,发表一些文章,以及简单的留言信息处理,就没有考虑框架,而是自己写了个模版解析函数,配合php的include,简单的做到页面结构和代码程序的分离。在生成静态文件的时候用了str_replae的函数,写了个模版标签匹配规则,然后替换模版变量。
全站静态和部分静态这里也纠结了一下,后来考虑到动态更新,不想搞太麻烦,就用了部分静态,既博文生成静态,而栏目首页则是动态读取。这时候有考虑到了一点,就是隐藏程序文件php后缀,所以就在目录结构上做了一些跳转。目录结果分为:index.php/公共/配置/搜索/标签/aip/模版/静态文件/后台等几大块。而隐藏后缀的技巧就是iis的默认文档跳转。
考虑到seo优化,那么文章想要配置的基本参数就是:生成静态文件名、标题、关键字、描述。而他的文件位置则有它所属的栏目分类里面配置。而这样就比较要有系统栏目配置功能。然后在seo就可以是:{标题-栏目名称-站点标识}的规则。这里我们涉及到一些全局想要的变量,比如站点标识可配置,所以就定义了一个配置文件,来集中配置站点的公用配置参数,如数据库配置,模版路径配置等。
对于站点的Tag管理,不复杂,是比较简单的读写,多了一个推荐标识。有时候我们会考虑到了是否显示,排序等功能,所以我们就在表总都统一增加了2个标识,显示/排序。下面是对一些关键表的介绍:
栏目(Category):id、标题、关键字、描述、栏目文章路径、是否显示
文章(Article):id、排序、标题、关键字、描述、缩略图、内容、时间、文件名、栏目标识、标签标识、推荐标识、留言次数、浏览次数、是否显示
标签(Tags):id、排序、名称、推荐标识、是否显示
当然,其他的留言表(Msg)则根据你想要的信息设计,但是其中有个文章关联id即可。其他还有演示(Demo)表、收藏链接(Link)表、以及恢复(Reply)表;
功能架构的实现:
?index.php简单栏目的入口
|---------cat=? 栏目的标识
|---------调用一个index_tpl模版 /tag/ 标签帅选入口
|----tid=?标签表示
|---调用一个tag_tpl模版 /search/ 搜索入口
|------keyword=? 关键字标识
|-----aid=?文章标识(jQuery.ui.autocomplete插件,可以精确搜索文章)
|-----调用一个search_tpl模版 /api/站点数据调用交互入口
|------接受action参数,然后对应的请求,返回数据和处理不同动作 random_tag_list模块函数,取出指定个数随机标签 random_lastest_article_list 模块函数 ,取出最新文章模版
总结:
php+Sqlite的搭配,也是存在不足的,比如安全性Sqlite是文件类似数据库,没有用户名和密码,如果路径暴露,就会带来很大的麻烦。但是也是有解决方案的,例如:
1.比较简单的措施就是数据库名字前面用“#”开头,但是用"%23"还是可以访问;
2.把数据库放在uri不可访问的路径中,带来的是网站转移的时候比较麻烦;
3.数据库改名.php结尾,在创建'<?php表就可以防止下载,运行报错。
另外一个就是,php+Sqlite数据库访问的类库没有mysql扩展的多,当时我就参考php-ease网站的SQLite Class整合了一个数据库访问接口。有兴趣的童鞋可以去研究研究,采用的是PDO方式连接.