为啥写这篇文章?
有人反映资料太少,学习成本太高。 GitHub 地址:https://github.com/pinpoint-apm/pinpoint-php-aop
什么是 Aspect Oriented Programming (AOP)
每个人看待这个世界的角度不一样,如果我们站在某个人的角度看这个世界,它的视野,就这他的面。
现在“某个人”,就是网站的性能。
ps: 性能是个很复杂,很广泛的话题,pinpoint 也只解决了部分问题。
言归正传,为啥要用这个库,它到底解决了哪些问题?
- 主动埋点,工作量大,升级迭代不方便。
- 历史代码,谁也不准改的问题。
pinpoint-php-aop 怎么解决这个问题?
在回答这个问题之前,先弄明白php语言里面,为啥这是个问题。
php 语言实现层面并没有简单且易用的AOP实现方案。因为它的优雅,简洁。边解析,边执行。
最终,还是有人找到了一个折衷方案: goaop。
你会问,为啥不用goaop,要自己开发*?
因为它不能满足监控内置函数的需求。
现在开始介绍pinpoint-php-aop 这个*怎样支持pinpoint监控php语言,并且解决上面的两个问题。
怎样使用?
- 加入到项目依赖 composer.json
- 引入到项目入口。比如index.php
GitHub: https://github.com/pinpoint-apm/pinpoint-php-aop
读完项目的readme, 你应该会大致知道怎么编写插件和引入到现有的项目中。
这里有个完整的 例子。
当上面步骤完成后,define(‘AOP_CACHE_DIR‘,__DIR__.‘/../Cache/‘)
对应目录会生成新的类文件,里面是生成后的类文件。完成了类替换,命名空间替换。如果你感兴趣具体的替换规则,请参考 pinpoint-php-aop test case
经过上面几步的搭建,部署流程你会开始慢慢明白里面的工作流程。
我们在回到开始的问题:
- 主动埋点,工作量大,升级迭代不方便。
- 历史代码,谁也不准改的问题。
主动埋点问题
编写对应功能(模块)的插件,实现埋点。由pinpoint-aop-php 自动生成埋点代码框架,在插件里面实现逻辑处理。这也是我们为啥会单独发布插件:用户可以自己非常方便定制化插件中的处理逻辑,添加自己感兴趣的操作。
针对 php中内置函数,比如PDO 。 提供了主动修改的策略: setting.ini。 尽量重复利用已有的插件。也让插件的开发变得更加灵活,比如 监控 easyswoole 框架
历史代码问题
当第一个问题解决了,这个问题就简单了。
业务无侵入,pinpoint-aop-php 自动生成代码,屏蔽业务上的处理细节。
目前已知的问题
- 必须使用composer类加载。虽然大部分框架都composer,但是仍然有很多项目不适用它。比如wordpress
ps: 我们在php 实现上面并没有做到
零侵入
。
至少你需要修改你的入口文件。that‘ all
如果你还有其他疑问,欢迎 issues。
感谢你宝贵的时间。