Skip to content

1)Hyperf

🌱 第 1 题(基础认知)

Q1:什么是 Hyperf?它与传统 PHP 框架(如 Laravel)相比有何优势?

📝 标准答案:

Hyperf 是一个基于 Swoole 的高性能、协程化、全栈式 PHP 框架,适合构建微服务、中后台系统、API 服务、高并发应用等。

主要特点:

  • 全协程化框架,支持异步非阻塞;
  • 基于 Swoole 实现常驻内存、超高性能
  • AOP(面向切面编程)支持完善
  • 自动依赖注入、强大的 IOC 容器机制
  • 丰富的官方组件(如 GRPC、JWT、Event、Crontab、Apollo 等);
  • 支持热重载、RPC、服务治理等微服务能力

对比 Laravel:

特性LaravelHyperf
运行模式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/rpchyperf/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 等链路追踪。