1)Hyperf
🌱 第 1 题(基础认知)
Q1:什么是 Hyperf?它与传统 PHP 框架(如 Laravel)相比有何优势?
📝 标准答案:
Hyperf 是一个基于 Swoole 的高性能、协程化、全栈式 PHP 框架,适合构建微服务、中后台系统、API 服务、高并发应用等。
主要特点:
- 全协程化框架,支持异步非阻塞;
- 基于 Swoole 实现常驻内存、超高性能;
- AOP(面向切面编程)支持完善;
- 自动依赖注入、强大的 IOC 容器机制;
- 丰富的官方组件(如 GRPC、JWT、Event、Crontab、Apollo 等);
- 支持热重载、RPC、服务治理等微服务能力。
对比 Laravel:
特性 | Laravel | Hyperf |
---|---|---|
运行模式 | FPM,请求销毁 | Swoole,常驻内存 |
并发支持 | 差 | 强(协程调度) |
异步能力 | 无原生支持 | 原生协程异步 |
微服务支持 | 弱 | 强(RPC、注册中心等) |
性能 | 一般 | 极高 |
🌿 第 2 题(框架机制)
Q2:Hyperf 是如何实现协程化的?协程带来的好处有哪些?
📝 标准答案:
Hyperf 基于 Swoole 的协程能力,提供了**协程客户端(如 Redis、MySQL、HttpClient)**和自动协程调度机制。
关键机制:
- 使用
go()
启动协程; - 使用 Swoole Hook 对 IO 操作(如文件、网络)进行挂起与恢复;
- 所有 Hyperf 内部组件(如数据库、缓存、HTTP 请求)都提供协程化版本;
- 配合 依赖注入容器,协程上下文自动隔离,保证线程安全。
好处:
- 并发处理多个任务,提高系统吞吐量;
- 使用同步代码写法实现异步逻辑,简洁可读;
- 性能提升显著,适合高并发业务场景。
🌳 第 3 题(依赖注入 & AOP)
Q3:Hyperf 是如何实现依赖注入(DI)与 AOP(面向切面编程)的?举例说明。
📝 标准答案:
Hyperf 使用的是基于 PSR-11 容器规范 的 DI 容器,结合注解(如 @Inject
、@Aspect
)和反射实现依赖自动注入。
依赖注入:
php
use App\Service\UserService;
class UserController extends AbstractController
{
public function __construct(private UserService $userService) {}
public function index()
{
return $this->userService->getUser();
}
}
Hyperf 容器会自动识别 UserService
并注入实例。
AOP 示例:日志记录 Aspect
php
use Hyperf\Di\Annotation\Aspect;
use Hyperf\Di\Aop\AbstractAspect;
#[Aspect]
class LogAspect extends AbstractAspect
{
public array $classes = [UserService::class . '::getUser'];
public function process(ProceedingJoinPoint $proceedingJoinPoint)
{
$start = microtime(true);
$result = $proceedingJoinPoint->process();
$time = microtime(true) - $start;
var_dump("Execution time: {$time}");
return $result;
}
}
此切面会拦截 getUser
方法,并记录执行时间,无需改动业务代码。
🌲 第 4 题(实际场景)
Q4:如何在 Hyperf 中使用协程 Redis + MySQL,实现高性能的数据读取逻辑?
📝 标准答案:
Hyperf 内建协程化客户端,可以用同步风格调用 Redis、MySQL,但实际是异步非阻塞的。
配置连接池(config/autoload/redis.php)
php
return [
'default' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'pool' => [
'min_connections' => 1,
'max_connections' => 10,
],
],
];
服务调用示例:
php
use Hyperf\DbConnection\Db;
use Hyperf\Redis\RedisFactory;
class UserService
{
public function __construct(private RedisFactory $redisFactory) {}
public function getUser(int $id): array
{
$redis = $this->redisFactory->get('default');
$cacheKey = "user:{$id}";
$user = $redis->get($cacheKey);
if (!$user) {
$user = Db::table('users')->where('id', $id)->first();
$redis->set($cacheKey, json_encode($user), 600); // cache 10 min
}
return json_decode($user, true);
}
}
此逻辑能并发处理大量请求且不阻塞,极大提升性能。
🪵 第 5 题(微服务能力 & 异常处理)
Q5:Hyperf 如何支持微服务架构?以及如何统一处理异常和日志记录?
📝 标准答案:
✅ 微服务支持:
Hyperf 提供 完整的微服务组件生态:
能力 | 组件 |
---|---|
服务注册发现 | hyperf/service-governance (支持 Nacos、Consul、Etcd) |
RPC 调用 | hyperf/rpc 、hyperf/grpc |
配置中心 | Apollo、Nacos 支持 |
服务限流熔断 | Sentinel、RateLimiter |
API 网关 | 支持 HTTP 入口聚合 |
链路追踪 | Skywalking、Zipkin 集成 |
✅ 异常与日志:
- 统一异常处理:
- 自定义异常处理类实现
Hyperf\ExceptionHandler\ExceptionHandlerInterface
- 通过
handle()
方法拦截所有异常,统一格式化输出
- 自定义异常处理类实现
php
class AppExceptionHandler extends ExceptionHandler
{
public function handle(Throwable $throwable, ResponseInterface $response)
{
return $response->json([
'code' => 500,
'msg' => $throwable->getMessage(),
]);
}
public function isValid(Throwable $throwable): bool
{
return true;
}
}
- 日志记录:
- 使用
Hyperf\Logger\LoggerFactory
; - 支持按业务模块分日志、按天切割;
- 可对接远程 ELK、Sentry、Skywalking 等链路追踪。
- 使用