同时支持直接new和从容器获取需要被切入的对象,也支持三方库的切入vendor目录下的类方法, 在不改变现有代码的情况下切入需要切入的前置后置方法,用在统计http请求,Rpc,组件链路追踪,日志记录,统计函数耗时 修改函数返回结果的应用场景
composer require xiaoyangguang/aop
php start.php start
curl http://127.0.0.1:8787
此时控制台打印前置和后置切面函数打印值
string(12) "beforeAdvice"
string(11) "afterAdvice"
好东西,webman在aop上又有了新选择 👍
@张先生 辛苦下帮忙提交到 https://www.workerman.net/plugin/create
大赞
谢谢
这不是我敬爱的前同事嘛?肖肖童鞋
常老师真长
同盟师兄弟啊
还没看过源代码,来问问,必须要生成代理类吗?如果在readonly环境下呢?怎么解决?比如在serverless中的docker readonly
eval() 函数可以考虑,可以不用写权限,但是我的应用环境中用到了DI注解然而注解是通过扫描文件的注释解析出来的,必须要用到实体文件。否则file_get_contents 获取不到对应的文件内容。所以eval函数会出问题,遂放弃使用eval函数。如果您的环境没用到读取原始文件的地方eval函数也是可以的,不用写代理文件数据到磁盘。
aop就是装饰器模式,使用动态代理和静态代理来做,静态代理有一部分做法是手动写代理类,还有一部分是交给程序生成代理类文件;动态代理的话可以把代理的实力对象放入内存中,通常来说使用eval+容器钩子实现,不过考虑到有一些服务可能因为安全因素禁用eval,而且PHP的民间注解和官方注解都需要使用到反射获取相应内容,所以一般都是静态代理;如果不用注解想使用动态代理的话除了eval也可以使用类似中间件的做法,只是把中间件array_reduce颗粒度缩小到函数,不过比较麻烦
当然,这个地方,你如果第一次读区PHP文件的时候根据调用链路层层递归将反射的内容获取到当前进程的静态变量中保存,其实也可以实现注解+aop,不过可能初次加载的时间会比较长,内存占用也会比较大,但是一旦加载完成,管理效率肯定比代理文件会好一些,当然,在常驻内存下,代理文件也只会加载一次,其实也没啥太大的问题
composer require xiaoyangguang/aop
刚进行测试,php要求 ~7.2 8版本无法使用,作者什么时候方便搞一下php8版本
我已转行,不再维护,你可以自行研究,代码就几百行
好的