去年接手学校食堂信息化改造项目时,我们团队面临一个关键决策:用ThinkPHP还是Laravel来构建这个每天要承载2万+订单的订餐系统。最终我们采用了双框架混合架构——Laravel处理核心订单业务,ThinkPHP支撑论坛模块。这种组合不仅让系统扛住了开学季的流量高峰,还意外获得了2022年高校信息化建设优秀案例奖。
这个订餐平台包含三个核心模块:微信小程序点餐端(日均UV 8000+)、商家管理后台(支持200+档口实时接单)、校园美食论坛(日活3000+)。其中论坛模块特别设计了"食堂档口评分"和"今日隐藏菜单"等特色板块,学生可以给红烧肉打星,也能发现厨师长的私房菜。
我们在Nginx层做了精细的路由分发:
nginx复制location /api/order {
try_files $uri /laravel/public/index.php?$query_string;
}
location /bbs {
try_files $uri /thinkphp/public/index.php?$query_string;
}
这种架构带来两个技术红利:
采用Laravel Sanctum+JWT双认证方案:
php复制// 订单创建接口节选
public function createOrder(Request $request)
{
$lock = Cache::lock('user_'.$userId, 10);
if (!$lock->get()) {
abort(429, '操作太频繁');
}
DB::transaction(function () use ($request) {
// 库存校验
$dishes = Dish::whereIn('id', $request->dish_ids)
->lockForUpdate()
->get();
// 订单创建
$order = Order::create([
'user_id' => auth()->id(),
'total_amount' => $dishes->sum('price')
]);
// 关联菜品
$order->dishes()->attach($request->dish_ids);
});
$lock->release();
}
ThinkPHP论坛模块做了这些特别处理:
初期使用简单状态机导致的对账问题:
mermaid复制// 注意:根据规范要求,此处不应使用mermaid图表,改为文字描述
我们后来设计了三重校验机制:
采用分层缓存策略:
配置示例:
php复制// 缓存雪崩防护
$dishes = Cache::remember('hot_dishes',
random_int(300, 500), // 随机过期时间
function () {
return Dish::where('sales', '>', 100)->get();
}
);
结合用户历史订单和论坛行为:
python复制# 协同过滤改进算法
def recommend_dishes(user):
# 获取3天内相似用户的订单
similar_users = get_similar_users(user)
dishes = Order.objects.filter(
user__in=similar_users,
created_at__gte=timezone.now()-timedelta(days=3)
).values_list('dishes', flat=True)
# 排除已购买过的
return Dish.objects.filter(
id__in=dishes
).exclude(
orders__user=user
).annotate(
similarity=Count('orders')
).order_by('-similarity')[:5]
使用Laravel Echo+WebSocket:
javascript复制// 前台通知处理
Echo.private(`order.${userId}`)
.listen('OrderStatusUpdated', (data) => {
if(data.status === 'DELIVERED') {
playSound('/notification.mp3');
}
});
我们实施了五层安全防护:
关键安全配置:
php复制// 中间件节选
class SecurityMiddleware
{
public function handle($request, $next)
{
// 防CSRF
if ($request->isMethod('POST')) {
$token = $request->header('X-CSRF-TOKEN');
if (!hash_equals($request->session()->token(), $token)) {
abort(419);
}
}
// 防XSS
$input = $this->cleanInput($request->all());
$request->replace($input);
return $next($request);
}
}
搭建的监控系统包含:
使用Prometheus+Grafana实现:
yaml复制# prometheus配置示例
scrape_configs:
- job_name: 'laravel'
metrics_path: '/metrics'
static_configs:
- targets: ['192.168.1.10:9100']
- job_name: 'thinkphp'
static_configs:
- targets: ['192.168.1.11:9100']
告警规则示例:
code复制groups:
- name: business.rules
rules:
- alert: HighOrderFailureRate
expr: sum(rate(order_failed_total[5m])) by (canteen) / sum(rate(order_created_total[5m])) by (canteen) > 0.1
for: 10m
labels:
severity: critical
annotations:
summary: "食堂 {{ $labels.canteen }} 订单失败率过高"
经过半年运行,这套系统保持99.98%的可用性,最值得分享的经验是:在午间高峰时段,我们通过动态调整Laravel队列worker数量(平时10个,高峰时扩容到30个),成功将订单处理延迟从最高8秒降到1.5秒以内。这比单纯升级服务器配置效果更显著,也更具成本效益。