基于swoole框架进行二次封装,php高性能业务框架编写思路
swoole已经是php高性能服务器事实标准,可以参考这个博客使用swoole开发业务框架
项目地址:https://github.com/neatlife/pframework
欢迎star,欢迎pr
⁃ 框架执行的核心流程图如下(右键可查看大图):
- 通用组件尽量遵守psr进行实现,以提高对三方组件的兼容性
- 事件驱动
全局变量适配
swoole是从命令行启动,常驻进程运行,web请求处理依赖的全局变量比如 \(_SERVER, \)_GET, \(_POST, \)_FILES等不会随着每次请求的改变填上对应的值,swoole把这个每次请求的变量放在了Swoole\Http\Request对象中
dotenv 2到3版本设计模式重构实战分析
老大说了这个dotenv的重构比较适合用来学习,进行了分析,并分享了出来
github项目地址: https://github.com/vlucas/phpdotenv
dotenv是一个php写的从文件中加载环境变量的库,库本身文件数量较少,比较容易阅读。
核心api变动
2.x实例化方式
$dotenv = new Dotenv\Dotenv(__DIR__, 'myconfig');
$dotenv->load();
3.x实例化方式
$dotenv = Dotenv\Dotenv::create(__DIR__, 'myconfig');
$dotenv->load();
静态工厂方法设计模式应用
这个3.x版本create方法创建对象使用的是工厂方法设计模式
核心实例化dotenv对象由手动调用构造方法重构成了静态工厂方法,这个改变是因为这个dotenv加载.env文件需要判断env文件、envFactory对象是否传递,而这个判断是个if else的逻辑,根据构造方法不宜写逻辑定理,如果不使用静态工厂方法进行重构,那么在new DotEnv之前,必须手动判断.env是否存在。在多次实例化这个Dotenv对象时,必然造成代码重复。
通过工厂方法封装创建对象的逻辑,以避免创建对象的代码重复,是非常常见的一种设计模式的最佳实践
xaop源码分析
项目地址:https://github.com/liqiongfan/xaop
思路: hook掉php执行函数的方法(zend_execute_ex),然后使用call_user_function调用自定义的回调函数
文件和作用
Xaop操作类的所有方法:kernel/xaop.c
Xaop操作类会使用的宏,比如解析和检查方法的参数:kernel/xaop.h
扩展调用php函数的函数:kernel/helper.c 和 kernel/helper.h
替换php的zend_execution_ex: kernel/exec.c 和 kernel/exec.c
解析用户编写的annotation的相关逻辑:kernel/parsing.c 和 kernel/parsing.h
全局变量定义在: php_xaop.h
全局工具类zend_class_entry的声明*annotation_ce, *doc_ce, *xaop_ce:kernel/classes.c
检查参数是否合法
#define CHECK_PARAM() do {\
if ( Z_TYPE_P(class_name) != IS_STRING && Z_TYPE_P(class_name) != IS_NULL ) { \
php_error_docref(NULL, E_ERROR, "First argument need to be a valid class name or NULL");\
return ;\
}\
if ( ZSTR_LEN(function_name) && '*' == ZSTR_VAL(function_name)[0] ) { \
php_error_docref(NULL, E_ERROR, "Function name mustn't be `*`.");\
return ;\
}\
if ( !zend_is_callable(aop, IS_CALLABLE_CHECK_NO_ACCESS, NULL) ) {\
php_error_docref(NULL, E_ERROR, "Third argument is expected to be a valid callback");\
return ;\
}\
} while(0)
Copyright © 2015 Theme used GitHub CSS. 访问人/ 次