PHP 怎么系统设计

wen PHP项目 3

本文目录导读:

PHP 怎么系统设计

  1. 架构分层(核心原则)
  2. 依赖注入(DI)与容器
  3. 错误处理与异常体系
  4. 数据库迁移与种子(Versioning)
  5. 缓存策略(多级缓存)
  6. 队列与异步处理
  7. 认证与授权
  8. 配置管理(12-Factor App)
  9. 测试策略
  10. 优化与部署(生产实战)
  11. 系统设计模式清单(PHP常用)
  12. 典型项目目录结构(Laravel示例)
  13. 系统设计5条铁律
  14. 推荐工具链

在PHP中进行系统设计,核心在于架构分层依赖管理可扩展性,以下是一套从零到生产环境的系统性设计指南。


架构分层(核心原则)

这是PHP系统设计的基石,最经典的是三层架构,复杂系统可升级为DDD(领域驱动设计)

Controller(控制器) -> Service(业务逻辑) -> Repository(数据访问)
        |                    |                        |
        |--- Request/Response |--- DTO/Entity          |--- ORM / Query Builder
        |--- Validation       |--- Transactions        |--- Cache
        |--- Auth             |--- Events              |--- Raw SQL

关键实践:

  • Controller 极简:只做参数接收、请求校验、调用Service、返回JSON/视图。
  • Service 重业务:所有业务流程、事务、规则判断都在Service层。
  • Repository 管数据:屏蔽数据库差异,方便替换(如从MySQL换为PostgreSQL)。
  • 禁止跨层调用:Controller不能直接调用Repository。

依赖注入(DI)与容器

这是现代PHP框架(Laravel、Symfony)的核心,也是系统解耦的关键。

// 不使用容器(耦合)
class UserService {
    private $mailer;
    public function __construct() {
        $this->mailer = new Mailer(); // 硬依赖
    }
}
// 使用容器(解耦)
class UserService {
    private $mailer;
    public function __construct(MailerInterface $mailer) {
        $this->mailer = $mailer; // 注入抽象,具体实现由容器决定
    }
}
// 容器配置
$container->bind(MailerInterface::class, SmtpMailer::class);

规则:接口编程(依赖抽象而非实现),构造函数注入(避免属性注入和setter注入)。


错误处理与异常体系

PHP系统容易产生“警告淹没”,必须建立统一的异常体系。

// 三层异常
- 基础异常:RuntimeException(运行时)
- 业务异常:BusinessException(可预期,如库存不足)
- 框架异常:HttpException(404、500)
// 全局异常处理器(中间件)
try {
    // 业务代码
} catch (BusinessException $e) {
    return response()->json(['error' => $e->getMessage()], 400);
} catch (Exception $e) {
    \Log::error($e->getMessage());
    return response()->json(['error' => '服务器内部错误'], 500);
}

禁止:在业务代码中使用裸的 catch(Exception)echo 输出。


数据库迁移与种子(Versioning)

系统迭代中,数据库结构会频繁变动,必须使用迁移工具。

# Laravel / Symfony / Phinx
php artisan make:migration create_users_table
php artisan migrate        # 版本化执行
php artisan db:seed        # 填充基础数据

设计原则

  • 每个迁移文件只做一件事(创建表、修改字段、索引)。
  • 禁止修改已经提交的迁移文件,只能新建迁移去修改。
  • 种子数据用于开发环境,生产环境单独脚本。

缓存策略(多级缓存)

PHP系统性能瓶颈多在数据库,必须设计缓存链路。

第一层:OPcache(编译缓存,必须开启)
第二层:本地缓存(APCu / Redis in-memory)
第三层:分布式缓存(Redis / Memcached)
使用场景:
- 热点数据:用户信息、配置项(缓存+过期时间)
- 列表数据:分页查询结果(缓存+版本号)
- 计数器:库存扣减(Redis incr/decr 原子操作)
- 会话状态:Session存Redis(集群部署必需)

缓存穿透防护:缓存空值/布隆过滤器。
缓存雪崩防护:过期时间加随机抖动。
缓存一致性:先更新数据库,再删除缓存(Cache-Aside)。


队列与异步处理

PHP是同步阻塞的,耗时操作必须异步化。

// 定义任务(Laravel 示例)
class SendWelcomeEmail implements ShouldQueue {
    public $user;
    public function handle(EmailService $email) {
        $email->sendWelcome($this->user);
    }
}
// 入队
dispatch(new SendWelcomeEmail($user));
// 队列驱动:database(开发)、redis(生产)、rabbitmq(高吞吐)

适用场景:邮件、短信、短信验证码、图片处理、数据报表生成、Webhook通知。


认证与授权

Auth(认证)

  • Laravel Sanctum(API Token)适合Laravel生态。
  • OAuth2 / JWT(跨系统单点登录)。
  • 密码存储:绝不存明文,使用 password_hash()(bcrypt默认),或password_needs_rehash()

Authorization(授权)

  • RBAC:角色(管理员/编辑/用户)绑定权限。
  • Policy:基于资源的授权(如 $user->can('update', $post))。

配置管理(12-Factor App)

  • 代码和配置完全分离。
  • 使用环境变量(.env),生产环境从密钥管理系统读取。
  • 敏感信息(DB密码、API密钥)绝不进入版本库。
# .env 示例
DB_HOST=127.0.0.1
DB_DATABASE=mydb
STRIPE_SECRET=sk_live_xxxxxx   // 生产环境使用环境变量注入

测试策略

系统越复杂,测试越重要,分层测试:

- 单元测试(Unit):Service层方法(Mock数据库)
- 集成测试(Integration):真实数据库事务(Rollback)
- 功能测试(Feature):Controller API(发送HTTP请求验证响应)
- 端到端测试(E2E):浏览器自动化(可选)
# 覆盖率目标(最低)
- Service层:80%
- Controller层:60%
- 核心逻辑(订单、支付):100%

优化与部署(生产实战)

性能优化清单:

  1. Composer优化composer install --optimize-autoloader --no-dev
  2. 配置缓存php artisan config:cache(勿在生产改配置)
  3. 视图缓存php artisan view:cache
  4. OPcache:开启且配置 opcache.enable=1,避免重复解析。
  5. HTTP连接:启用 FastCGI Process Manager (PHP-FPM) 且设置 pm.max_requests=500

部署规范:

  • 使用 Docker容器化(CI/CD流水线)。
  • 零停机:新版本部署后,先跑迁移再重启PHP-FPM。
  • 日志集中化:ELF Stack(Elasticsearch + Logstash + Kibana)或Sentry。

系统设计模式清单(PHP常用)

场景 模式 说明
重复对象创建 Singleton(单例) DB连接池、Redis连接
动态行为扩展 Strategy(策略) 多种支付方式(微信/支付宝/银行卡)
对象状态观察 Observer(观察者) 用户注册后发邮件+短信+积分
统一访问入口 Facade(门面) 封装复杂子系统(如API客户端)
树形层级结构 Composite(组合) 商品分类递归
避免重复查询 Repository(仓储) 统一数据入口

典型项目目录结构(Laravel示例)

app/
├── Controllers/         # HTTP入口
├── Services/            # 业务逻辑核心
│   ├── Order/
│   │   ├── OrderService.php
│   │   └── OrderValidator.php
├── Repositories/        # 数据访问
├── Models/              # Eloquent
├── Events/ & Listeners/ # 事件驱动
├── Jobs/                # 异步任务
├── Exceptions/          # 自定义异常
└── Providers/           # 服务注册

系统设计5条铁律

  1. 层间解耦:Controller 绝不直接写SQL。
  2. 依赖注入:随时可替换实现,便于测试。
  3. 失败安全:所有操作要么成功提交、要么回滚(事务贯穿)。
  4. 异步优先:不能让请求等待不需要结果的操作。
  5. 测试补全:核心业务逻辑必须有自动化测试覆盖。

推荐工具链

  • 框架:Laravel(全栈生态) / Symfony(企业级灵活)
  • 测试:PHPUnit + Mockery / Pest
  • 队列:Redis + Horizon(Laravel)
  • 监控:Telescope(开发)/ Ray(调试)
  • API文档:Scribe / Swagger UI
  • 静态分析:PHPStan(Level 5+)/ Psalm

如果有具体的业务场景(如高并发秒杀、多租户SaaS、微服务拆分),可以进一步探讨详细设计。

抱歉,评论功能暂时关闭!