bzf架构
3.1. 开源框架
bzfshop 采用了很多开源的框架和库来组织我们整个代码,这些开源库是你首先需要了解的东西,否则
一些代码调用你会完全看不懂。如果你对这些开源系统不熟悉的话,建议你先 Google 学习这些开源系统,
通读它们的文档,等你对这些系统本身已经有足够的了解之后再去看 bzfshop 的代码。
F3: Fat Free Framework 是一个 PHP 框架,我们用它实现了 路由、缓存、数据库访问,了解
F3 框架是读懂 bzfshop 的第一步。我们使用 F3 框架最主要的原因就是它够小、够轻、够用。
Smarty: PHP 著名的模版引擎,关于 PHP 是否有必要用模版还有很多的争论。我们用 Smarty 看
重的不是它的模版,而是它的页面缓存机制。Smarty 有良好的页面缓存机制,方便我们对真个页面做全面
的缓存或者静态化从而能大大提供整个系统的性能。
种方式的 URL 发布,可以自己查看 AssetManage 的代码,里面有设置。我们之所以采用
1388119183.example.js而不是 example.js?hash=1388119183是因为国内很多 CDN 都
很屎,他们对于这种带参数的静态资源会把它们认为是动态资源从而不做缓存,结果 CDN 就无效
了。
bzfshop 采用了很多开源的框架和库来组织我们整个代码,这些开源库是你首先需要了解的东西,否则
一些代码调用你会完全看不懂。如果你对这些开源系统不熟悉的话,建议你先 Google 学习这些开源系统,
通读它们的文档,等你对这些系统本身已经有足够的了解之后再去看 bzfshop 的代码。
F3: Fat Free Framework 是一个 PHP 框架,我们用它实现了 路由、缓存、数据库访问,了解
F3 框架是读懂 bzfshop 的第一步。我们使用 F3 框架最主要的原因就是它够小、够轻、够用。
Smarty: PHP 著名的模版引擎,关于 PHP 是否有必要用模版还有很多的争论。我们用 Smarty 看
重的不是它的模版,而是它的页面缓存机制。Smarty 有良好的页面缓存机制,方便我们对真个页面做全面
的缓存或者静态化从而能大大提供整个系统的性能。
3.6.3. Whoops调试
bzfshop 集成了 Whoops 开源库用于调试严重错误。有时候,你的程序写了一个严重的错误(比如
PHP 语法写错了,或者发生了严重的 Exception),这种时候可能连日志系统本身都已经不能正常工作
了,所以你压根就没日志可以看,这种情况下该如何调试呢?
下面做我们做一个简单的测试,打开 Theme/Shop/shop/Code/Controller/Shop/Index.php在
里面的 get() 方法处随便乱写一些东西(语法错误)。如下所
bzfshop 集成了 Whoops 开源库用于调试严重错误。有时候,你的程序写了一个严重的错误(比如
PHP 语法写错了,或者发生了严重的 Exception),这种时候可能连日志系统本身都已经不能正常工作
了,所以你压根就没日志可以看,这种情况下该如何调试呢?
下面做我们做一个简单的测试,打开 Theme/Shop/shop/Code/Controller/Shop/Index.php在
里面的 get() 方法处随便乱写一些东西(语法错误)。如下所
32
3.6.4. 其它调试
Web页面调试本身就不好操作,基本上打印日志、查看日志可以说是最有效的方法了。如果你觉得
bzfshop 提供的调试方法还不够,那么你还可以使用你自己喜欢的方法。
我们用过的调试方法还有 ZendDebugger/XDebug 配合 IDE 做单步执行,一行一行的代码走下去,
跟踪错误直到我们发现问题为止。这种情况一般用于逻辑错误,即程序能跑过,但是输出的结果就是不对,逻
辑错误很难查找,于是考虑单步执行。但是这种单步执行效率真心不高,调试起来效率也很低,还不如打印
Log 来得快,所以我们用得很少,或者说基本不用。
目前我们只用 XDebug 配合 Valgrind 做性能剖析(Performance Profile)。一般在程序开发
的晚期,我们会做 Performance Profile ,确定性能的瓶颈在什么地方,然后做相应的优化,我们也用
相同的方法来验证缓存带来的性能提升是否有效。具体这些性能调优的方法我们会在 bzfshop设计文档 中
详细写,这里就不再展开了。
3.6.4. 其它调试
Web页面调试本身就不好操作,基本上打印日志、查看日志可以说是最有效的方法了。如果你觉得
bzfshop 提供的调试方法还不够,那么你还可以使用你自己喜欢的方法。
我们用过的调试方法还有 ZendDebugger/XDebug 配合 IDE 做单步执行,一行一行的代码走下去,
跟踪错误直到我们发现问题为止。这种情况一般用于逻辑错误,即程序能跑过,但是输出的结果就是不对,逻
辑错误很难查找,于是考虑单步执行。但是这种单步执行效率真心不高,调试起来效率也很低,还不如打印
Log 来得快,所以我们用得很少,或者说基本不用。
目前我们只用 XDebug 配合 Valgrind 做性能剖析(Performance Profile)。一般在程序开发
的晚期,我们会做 Performance Profile ,确定性能的瓶颈在什么地方,然后做相应的优化,我们也用
相同的方法来验证缓存带来的性能提升是否有效。具体这些性能调优的方法我们会在 bzfshop设计文档 中
详细写,这里就不再展开了。
3.6.5. 调试总结
bzfshop 系统提供 3 种调试的方法:
• Web 页面日志
• 日志文件
• Whoops 调试
最简单、最常用的就是 Web 页面日志,你在程序里面打印 debug 日志,Web 页面直接就显示了出
来,方便你随时查看。如果 Web 页面不存在,那你就去日志文件中查看日志。如果系统发生严重错误(系统
崩溃了)Whoops 调试系统会帮助你迅速找到错误所在。
bzfshop 系统提供 3 种调试的方法:
• Web 页面日志
• 日志文件
• Whoops 调试
最简单、最常用的就是 Web 页面日志,你在程序里面打印 debug 日志,Web 页面直接就显示了出
来,方便你随时查看。如果 Web 页面不存在,那你就去日志文件中查看日志。如果系统发生严重错误(系统
崩溃了)Whoops 调试系统会帮助你迅速找到错误所在。
么显示错误消息呢? 你可以试试,参数 goods_id换换不同的非法值,看看是不是已经有错误提示消
息了?事实上 bzfshop 本身集成了一套 flash message 的显示机制,这是由 PHP + Cookie +
JavaScript 配合一起完成显示的,关于 FlashMessage 的实现细节请查看 bzfshop设计文档。
息了?事实上 bzfshop 本身集成了一套 flash message 的显示机制,这是由 PHP + Cookie +
JavaScript 配合一起完成显示的,关于 FlashMessage 的实现细节请查看 bzfshop设计文档。
bzfshop 设计是面向 CDN 运行的,CDN 会缓存你所有的静态文件。传统的方式如果你的静态文件发
生了修改,你需要去 CDN 刷新这个文件,否则用户访问仍然是旧文件。bzfshop 的设计避免了这样的麻
烦,AssetManage 会发现资源文件发生了修改,然后主动重新发布资源文件(换名发布),这样对 CDN
而言这就是一个新文件会自动加载这个新文件,完全不用去刷新 CDN。至于旧文件就扔在哪里不用管它好
了,反正后面也不会引用到了。
注意
bzfshop 是面向 CDN 运行设计的,采用 AssetManage 管理资源。资源的任何修改都会触
发重新 "换名发布",所以完全不需要做任何 CDN 的刷新操作。
在这章里面我们向你展示一个插件例子,插件有自己的 css, js 文件,插件的页面也完全是由自己的
css, js 渲染的。插件需要使用 AssetManage 发布自己的资源,这样用户才能访问得到。例子代码在这
里 下载
4
。传统的资源版本控制一般是 /…/example.js?hash=1388119183,采用一个参数来使
得 URL 不同从而迫使浏览器在资源发生变化的时候重新加载资源。bzfshop 本身也支持这生了修改,你需要去 CDN 刷新这个文件,否则用户访问仍然是旧文件。bzfshop 的设计避免了这样的麻
烦,AssetManage 会发现资源文件发生了修改,然后主动重新发布资源文件(换名发布),这样对 CDN
而言这就是一个新文件会自动加载这个新文件,完全不用去刷新 CDN。至于旧文件就扔在哪里不用管它好
了,反正后面也不会引用到了。
注意
bzfshop 是面向 CDN 运行设计的,采用 AssetManage 管理资源。资源的任何修改都会触
发重新 "换名发布",所以完全不需要做任何 CDN 的刷新操作。
在这章里面我们向你展示一个插件例子,插件有自己的 css, js 文件,插件的页面也完全是由自己的
css, js 渲染的。插件需要使用 AssetManage 发布自己的资源,这样用户才能访问得到。例子代码在这
里 下载
4
。传统的资源版本控制一般是 /…/example.js?hash=1388119183,采用一个参数来使
种方式的 URL 发布,可以自己查看 AssetManage 的代码,里面有设置。我们之所以采用
1388119183.example.js而不是 example.js?hash=1388119183是因为国内很多 CDN 都
很屎,他们对于这种带参数的静态资源会把它们认为是动态资源从而不做缓存,结果 CDN 就无效
了。
Service 都按照目录进行了分类,所以单纯从目录的名字上你应该就能猜出它的用途。
在看这些 Service 的时候你会注意到它们的方法命名有些特别,一些方法以 load 开
头,比如 loadGoodsById()、loadUserById(),一些方法的名字以 fetch 开头,比如
fetchGoodsArrayByGoodsIdArray()、fetchOrderGoodsArray()。这些命名不是随意取的,而是有
它特别的意义。
load 只返回一条记录,这个记录其实是 Core\Modal\SqlMapper对象,这个对象实现了 CRUD 操
作,也就是常见的 PHP 框架中说的 ActiveRecord 操作模式(不懂的请自行 Google)。所以 load
返回的对象你是可以直接执行 CRUD 操作的,例如:
load返回的数据对象可以直接做 CRUD 操作.
在看这些 Service 的时候你会注意到它们的方法命名有些特别,一些方法以 load 开
头,比如 loadGoodsById()、loadUserById(),一些方法的名字以 fetch 开头,比如
fetchGoodsArrayByGoodsIdArray()、fetchOrderGoodsArray()。这些命名不是随意取的,而是有
它特别的意义。
load 只返回一条记录,这个记录其实是 Core\Modal\SqlMapper对象,这个对象实现了 CRUD 操
作,也就是常见的 PHP 框架中说的 ActiveRecord 操作模式(不懂的请自行 Google)。所以 load
返回的对象你是可以直接执行 CRUD 操作的,例如:
load返回的数据对象可以直接做 CRUD 操作.
8.2.3. 更多用法
bzfshop 的 Modal 是对 Fat Free Framework 的简单扩展,如果你想更多的了解 Modal 的使
用方法,请查看 Fat Free Framework 的官方文档。
bzfshop 的 Modal 是对 Fat Free Framework 的简单扩展,如果你想更多的了解 Modal 的使
用方法,请查看 Fat Free Framework 的官方文档。

浙公网安备 33010602011771号