PHP项目架构评审与优化指南
架构评审核心维度
分层架构设计
// 反例:业务逻辑混在控制器
class UserController {
public function register($request) {
// 验证器逻辑
// 数据库操作
// 发送邮件
// 逻辑混合
}
}
// 正例:清晰分层
class UserController {
public function register(RegisterRequest $request) {
$this->userService->register($request->validated());
return response()->success();
}
}
class UserService {
public function register(array $data) {
DB::beginTransaction();
try {
$user = User::create($data);
event(new UserRegistered($user));
DB::commit();
} catch (\Exception $e) {
DB::rollBack();
throw $e;
}
}
}
依赖注入与服务容器
// 优化前:Hard-coded依赖
class PaymentService {
public function process($order) {
$alipay = new AlipayService();
$alipay->pay($order->amount);
}
}
// 优化后:依赖注入
class PaymentService {
public function __construct(
private PaymentGatewayInterface $gateway,
private LoggerInterface $logger
) {}
public function process(Order $order) {
$this->logger->info('Processing payment', ['order_id' => $order->id]);
return $this->gateway->charge($order->amount);
}
}
设计模式应用
- 策略模式:支付方式、校验规则
- 观察者模式:事件监听、日志记录
- 工厂模式:对象创建、类实例化
- 仓储模式:数据访问抽象
性能优化关键点
数据库优化
// 反例:N+1查询
$users = User::all();
foreach ($users as $user) {
echo $user->profile->bio; // 每个用户查询一次
}
// 正例:预加载
$users = User::with('profile')->get();
// 索引优化
Schema::table('orders', function ($table) {
$table->index(['user_id', 'status', 'created_at']);
$table->index('order_no')->unique();
});
缓存策略
// 多级缓存实现
class ProductService {
public function getProduct(int $id): Product {
// L1: 内存缓存
if ($cached = Cache::tags(['products'])->get("product.{$id}")) {
return $cached;
}
// L2: Redis缓存
$product = Product::find($id);
Cache::tags(['products'])->put("product.{$id}", $product, 3600);
return $product;
}
}
队列与异步处理
// 耗时操作异步化
class OrderService {
public function placeOrder(OrderRequest $request) {
$order = $this->db->transaction(function() use ($request) {
$order = Order::create($request->validated());
OrderItem::insert($request->items);
return $order;
});
// 异步任务
dispatch(new SendOrderConfirmation($order));
dispatch(new UpdateInventory($order))->onQueue('inventory');
return $order;
}
}
安全性评审
输入验证
// 使用自定义验证规则
Validator::extend('phone', function ($attribute, $value, $parameters, $validator) {
return preg_match('/^1[3-9]\d{9}$/', $value);
});
// 请求模型验证
class CreateUserRequest extends FormRequest {
public function rules() {
return [
'email' => 'required|email|unique:users,email',
'password' => 'required|min:8|regex:/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)/',
'role' => 'in:admin,user,guest'
];
}
}
SQL注入防护
// 使用参数绑定
DB::select('SELECT * FROM users WHERE email = ?', [$email]);
// 使用ORM
User::where('email', $email)->first();
XSS与CSRF防护
// 输出转义
{{ $userInput }} // Blade自动转义
// CSRF保护
<form method="POST" action="/profile">
@csrf
<!-- 表单内容 -->
</form>
代码质量与可维护性
代码规范
// PSR-4自动加载
// 接口与实现分离
interface UserRepositoryInterface {
public function find(int $id): ?User;
public function save(User $user): bool;
}
class UserRepository implements UserRepositoryInterface {
// 实现
}
错误处理
// 统一的异常处理
class Handler extends ExceptionHandler {
public function register() {
$this->reportable(function (NotFoundException $e) {
Log::warning('Resource not found', ['exception' => $e]);
});
$this->renderable(function (ValidationException $e, $request) {
return response()->json([
'message' => 'Validation failed',
'errors' => $e->errors()
], 422);
});
}
}
架构评审清单
| 评审项 | 检查点 | 权重 |
|---|---|---|
| 分层设计 | 控制器、服务、仓库职责清晰 | 高 |
| 依赖管理 | 使用IoC容器,减少硬编码 | 高 |
| 数据库设计 | 索引合理,避免N+1查询 | 高 |
| 缓存策略 | 合理使用多级缓存 | 中 |
| 日志记录 | 统一日志格式,记录关键操作 | 中 |
| 安全防护 | 输入验证、权限控制、加密 | 高 |
| 测试覆盖 | 单元测试、集成测试 | 高 |
| 性能监控 | 数据库慢查询、API响应时间 | 中 |
优化建议实施路线
第1周:性能优化
- 数据库索引审查与优化
- 缓存策略实施
- 慢查询分析
第2周:代码重构
- 分层架构重构
- 依赖注入实施
- 设计模式应用
第3周:安全性增强
- 输入验证完善
- SQL注入防护
- XSS/CSRF防护
第4周:测试与监控
- 单元测试编写
- 集成测试实施
- 性能监控部署
工具推荐
- 代码分析:PHPStan, Psalm, PhpMetrics
- 性能分析:Xdebug, Blackfire, Tideways
- 数据库优化:MySQLTuner-perl, pt-query-digest
- 安全扫描:SonarQube, OWASP Dependency Check
实施以上架构评审与优化方案,能显著提升PHP项目的性能、安全性和可维护性,建议根据项目实际情况,制定具体的优化时间表,分阶段实施。
