本文目录导读:

- 架构分层(核心原则)
- 依赖注入(DI)与容器
- 错误处理与异常体系
- 数据库迁移与种子(Versioning)
- 缓存策略(多级缓存)
- 队列与异步处理
- 认证与授权
- 配置管理(12-Factor App)
- 测试策略
- 优化与部署(生产实战)
- 系统设计模式清单(PHP常用)
- 典型项目目录结构(Laravel示例)
- 系统设计5条铁律
- 推荐工具链
在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%
优化与部署(生产实战)
性能优化清单:
- Composer优化:
composer install --optimize-autoloader --no-dev - 配置缓存:
php artisan config:cache(勿在生产改配置) - 视图缓存:
php artisan view:cache - OPcache:开启且配置
opcache.enable=1,避免重复解析。 - 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条铁律
- 层间解耦:Controller 绝不直接写SQL。
- 依赖注入:随时可替换实现,便于测试。
- 失败安全:所有操作要么成功提交、要么回滚(事务贯穿)。
- 异步优先:不能让请求等待不需要结果的操作。
- 测试补全:核心业务逻辑必须有自动化测试覆盖。
推荐工具链
- 框架:Laravel(全栈生态) / Symfony(企业级灵活)
- 测试:PHPUnit + Mockery / Pest
- 队列:Redis + Horizon(Laravel)
- 监控:Telescope(开发)/ Ray(调试)
- API文档:Scribe / Swagger UI
- 静态分析:PHPStan(Level 5+)/ Psalm
如果有具体的业务场景(如高并发秒杀、多租户SaaS、微服务拆分),可以进一步探讨详细设计。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播