学习笔记20251220

消息队列:基于Redis的轻量级实践

  • 核心:使用Redis ZSET(有序集合)是实现延迟队列的经典方案。score 存储执行时间戳,member 存储任务数据,通过轮询获取到期的任务。
  • 应用场景扩展
    • 订单超时关闭:下单30分钟后未支付,触发关闭任务。
    • 异步通知:短信、邮件发送,失败后可重试。
    • 批量数据处理:如导出生报表,避免HTTP请求超时。
    • 更新第三方信息:比如微信授权信息
  • 优劣分析
    • 优点:实现简单,无需引入RabbitMQ等重型组件,利用现有Redis,非常适合中小型项目。
    • 缺点:可靠性、监控、高级特性(如ACK确认)不如专业消息队列。需自行处理崩溃后的任务恢复。
  • 对比点:这是与使用 RabbitMQKafka 的系统(如一些Java项目)的核心差异之一。

自动依赖的实现

  • 原理
    • 自动依赖解析:正是通过 Reflection(反射)实现,与你写的 Container 类思想一致。
    • 绑定与单例:可以将接口绑定到实现,并控制是否单例。
    • 无处不在:控制器构造函数、中间件、服务类等都能享受自动注入。

简单实现说明

<?php


class LoginServices
{
    public function login()
    {
        return 1;
    }
}

class Index
{
    protected $service;

    public function __construct(LoginServices $loginServices)
    {
        $this->service = $loginServices;
    }

    public function index()
    {
        return $this->service->login();
    }
}

// 简化版示例,展示 ThinkPHP 内部工作原理
class Container
{
    /**
     * @throws ReflectionException
     */
    public function make($className)
    {
        // 1. 创建反射类
        $reflector = new ReflectionClass($className);

        // 2. 获取构造函数
        $constructor = $reflector->getConstructor();

        if (!$constructor) {
            // 没有构造函数,直接实例化
            return new $className();
        }

        // 3. 获取构造函数参数
        $parameters = $constructor->getParameters();
        $dependencies = [];
//        var_dump($parameters);
        foreach ($parameters as $parameter) {
            // 4. 获取参数的类型声明
            $type = $parameter->getType();

            if ($type && !$type->isBuiltin()) {
                // 5. 如果是类类型,递归解析
                $dependencyClassName = $type->getName();
                $dependencies[] = $this->make($dependencyClassName);
            } else {
                // 6. 基本类型或未声明类型,尝试从配置获取或报错
                throw new Exception("无法解析参数: " . $parameter->getName());
            }
        }

        // 7. 实例化类,传入解析好的依赖
        return $reflector->newInstanceArgs($dependencies);
    }
}

$container = new Container();
$action = 'index';
var_dump($container->make(Index::class)->$action());
posted @ 2026-01-14 16:11  需要成长的小哥  阅读(4)  评论(0)    收藏  举报