1、简单说下 hyperf(什么是 hyperf)
答:hyperf 是一个依赖swoole扩展的 php 开源开发框架,它由黄朝辉团队设计创建维护,具备简洁而强大的组件和超强的并发性能,而且还支持微服务架构,例如:服务注册、RPC、配置中心、服务监控、分布式事务。
2、使用hyperf框架需要注意些什么问题。
答:不能使用全局变量,因为下划线 get、post、server、session、cookie,因为这些都是基于传统的 php-fpm 下的 cgi模式下运行的,是基于进程的生命周期的,而 hyperf 具备协程并发功能,所以 hyperf 的 request、session、cookie 这些组件就不能依据进程的生命周期去设计,所以不能使用还有通过容器获取的类都是单例的和避免在魔术方法中切换协程,还有避免在魔术方法中切换协程。
3、hyperf 的生命周期
i分为全局周期和请求周期还有协程的运行周期,全局周期是服务启动到结束的,请求周期是是一个用户请求到结束,协程周期基本都是异步的,在业务代码层进行控制。
4、 请简述一下hyperf的协程
“Hyperf 的协程是一种轻量级的线程,它不由 CPU 直接调度,而是由用户态的调度器进行调度。协程的调度有一定规则,并非完全无序,在单线程内代码依然是串行执行的。当协程遇到阻塞操作时,会自动切换到其他协程继续执行,这也是 Swoole 提供很多异步 MySQL、Redis 等组件的原因。在协程模式下,与请求相关的数据可以通过 Request
对象获取,要避免使用传统的全局变量来存储请求数据。”
5、defer、waitgroup、parallel 特性
Parallel 和 waitgroup都是为了使协程编程变得更加人性化设计的,主要用途是让主线程等待所有的子线程都执行完再往下继续运行。Parallel可以设置协程运行最大数,防止协程创建太多导致服务宕机。
use Hyperf\Coroutine\Exception\ParallelExecutionException;
use Hyperf\Coroutine\Coroutine;
use Hyperf\Coroutine\Parallel;
$parallel = new Parallel(5);
for ($i = 0; $i < 20; $i++) {
$parallel->add(function () {
sleep(1);
return Coroutine::id();
});
}
try{
$results = $parallel->wait();
} catch(ParallelExecutionException $e){
// $e->getResults() 获取协程中的返回值。
// $e->getThrowables() 获取协程中出现的异常。
}
6、hyperf 的事件机制
hyperf 支持事件的监听和定义,使用event组件实现,由 事件、监听器、事件调度器三部分组成。
开发流程就是,编写一个 监听和调度类,然后配置一下,在listen监听方法中添加要监听的类。
7、hyperf 的 aop 面向切面编程
aop编程思想主要是为了提高业务代码的可重用性,是面向对象的一种延生,在 hyperf 中使用Aspect来实现,$classes是切入的类和方法可以使用通配符,$annotations 是配置了注解的类,process方法是执行的逻辑。
8、hyperf 的路由
主要分为两种方式一种是配置文件配置,一种是注解方式配置,推荐注解方式,方便阅读和管理。
9、hyperf 的中间件
属于http-server组件的一部分功能,主要分为全局中间件和局部中间件,定义的方式有配置文件、路由配置和注解配置,执行顺序为 全局-类-方法。
10、hyperf controller
在编程时候需要注意不要 将单个请求相关的数据储存在类属性内,这样会出问题的,数据会混淆,可以使用协程上下文(Context)去实现。
11、hyperf 模型
使用了hyperf/db-connection它是基于hyperf/pool实现的数据库连接池。