本文目录导读:

这是一个非常庞大但也很系统的工程,用PHP搭建在线商城,通常有几种路径:从零手写、使用成熟框架、使用现成CMS。
对于大多数开发者而言,推荐使用成熟的开源商城系统(如Laravel + 扩展包,或直接使用WooCommerce/OpenCart),而不是完全从零手写,这样可以避开支付、安全、性能等大量“坑”。
下面我按照从零到一的逻辑,结合实际项目架构,为你梳理一份详细的指南,假设你已有PHP基础。
第一阶段:技术选型与规划(最重要)
在写任何代码前,先决定技术栈。
- 核心语言:PHP 8.0+(强烈推荐,性能和安全提升显著)。
- 框架(推荐):
- Laravel:最流行,生态最全(有现金贷、电商包),适合中大型、需要长期维护的项目。
- ThinkPHP:中文文档好,入门快,适合中小型企业项目。
- Yii2:性能极高,适合高并发场景。
- 前端:
- 如果做后台:AdminLTE 或 Vue/React + Element Plus。
- 如果做前台:Vue/React 分离式开发(API模式) 或 Blade模板(Laravel自带)混合开发。
- 数据库:MySQL 8.0 或 MariaDB(必选)。
- 缓存:Redis(必须,用于购物车、Session、商品详情缓存)。
- 运行环境:Nginx(推荐) + PHP-FPM。
工具:Composer(PHP依赖管理)、Git、一个IDE(PhpStorm或VSCode)。
第二阶段:核心功能模块设计(分步搭建)
一个标准商城至少需要以下模块,我们以 Laravel + RESTful API 为例:
用户与权限系统
- 功能:注册、登录、忘记密码、邮箱验证。
- 数据库表:
users,roles,permissions。 - 技术点:
- 使用 Laravel Breeze/Jetstream 快速生成登录。
- 权限管理使用 Spatie/laravel-permission 包。
- Token认证使用 Laravel Sanctum 或 JWT。
商品管理(核心)
- 功能:商品分类(无限级)、商品SPU/SKU管理、属性(颜色、尺寸等)、库存、图片、描述。
- 数据库表:
categories,products,product_skus,product_images,attributes。 - 技术点:
- SKU设计:一个商品有多个SKU(如:红色M码),用额外表
product_skus存储价格、库存。 - 图片处理:使用 Intervention/image 库进行缩略图、水印处理。
- SEO:自动生成商品URL(slug)。
- SKU设计:一个商品有多个SKU(如:红色M码),用额外表
购物车系统
- 方案选择(重要):
- Redis版(推荐,适合大流量):用户未登录时存Cookie,登录后同步到Redis,速度快,不占数据库。
- 数据库版:数据持久化,但查询慢。
- 前端Cookie版:简单,但丢失风险大,不支持跨设备。
- 数据库表:
cart_items或直接使用Redis hash。
订单系统(最复杂)
- 功能:下单(事务)、订单状态机(待付款 -> 已付款 -> 已发货 -> 已完成 -> 已取消)、快递单号。
- 数据库表:
orders,order_items,order_logs。 - 技术点(避坑指南):
- 事务处理:下单必须使用
DB::transaction(),步骤:扣库存 -> 创建订单 -> 清空购物车,任何一步失败,全部回滚。 - 超时取消:使用 Laravel 队列 或 Redis 过期键,处理长时间未支付的订单。
- 高并发下扣库存:使用 Redis 原子操作(
decr)或 MySQL 乐观锁,防止超卖。
- 事务处理:下单必须使用
支付系统(金钱重地,谨慎)
- 集成:支付宝、微信支付。
- 技术点:
- 使用官方SDK(如
yansongda/pay库,支持多通道)。 - 回调验证:绝对要验签!确保是服务器发来的请求,不是伪造的。
- 幂等性:同一个支付回调,只更新一次订单状态。
- 使用官方SDK(如
后台管理
- 功能:商品CRUD、订单管理、用户管理、数据统计、运单号录入。
- 技术点:
- 使用 Laravel Nova(付费,强大)或 Voyager(免费)或 Dcat Admin(国内常用)。
- 数据统计:每日订单数、销售额、转化率(可用
laravel-charts或写SQL)。
第三阶段:关键代码示例(核心逻辑)
目录结构(Laravel)
app/
Http/
Controllers/
Api/
ProductController.php
OrderController.php
CartController.php
PaymentController.php
Services/ # 业务逻辑层(很重要)
OrderService.php
CartService.php
Models/
Product.php
Order.php
User.php
database/
migrations/
2024_01_01_create_products_table.php
2024_01_02_create_orders_table.php
核心逻辑:下单服务(伪代码示例)
<?php
// app/Services/OrderService.php
namespace App\Services;
use App\Models\ProductSku;
use App\Models\Order;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Redis;
class OrderService
{
public function createOrder($user, array $skuIds)
{
// 使用数据库事务
return DB::transaction(function () use ($user, $skuIds) {
$totalAmount = 0;
$orderItems = [];
foreach ($skuIds as $skuId => $quantity) {
// 1. 锁定并扣减缓存库存(防止超卖)
$currentStock = Redis::decr('sku_stock:' . $skuId);
if ($currentStock < 0) {
Redis::incr('sku_stock:' . $skuId); // 回滚缓存
throw new \Exception('库存不足');
}
// 2. 获取SKU信息
$sku = ProductSku::lockForUpdate()->find($skuId); // 行级锁
if ($sku->stock < $quantity) {
throw new \Exception('库存不足');
}
// 3. 扣减数据库库存
$sku->decrement('stock', $quantity);
$totalAmount += $sku->price * $quantity;
$orderItems[] = [
'product_id' => $sku->product_id,
'sku_id' => $skuId,
'price' => $sku->price,
'quantity' => $quantity,
];
}
// 4. 创建订单
$order = Order::create([
'user_id' => $user->id,
'order_no' => date('YmdHis').uniqid(),
'total_amount' => $totalAmount,
'status' => Order::STATUS_PENDING, // 待付款
]);
// 5. 插入订单明细
$order->items()->createMany($orderItems);
// 6. 清空购物车(略)
// ...
return $order;
});
}
}
第四阶段:上线前的安全检查(避坑指南)
- 防止SQL注入:必须使用 ORM (Eloquent) 或 预处理语句(Prepared Statements)。
- XSS攻击:输出时使用
{{ $content }}(Laravel Blade自动转义),或htmlspecialchars。 - CSRF防护:所有表单添加
@csrf或 API使用Sanctumtoken。 - 文件上传:上传目录设为不可执行权限,例如
storage/app/public/uploads,chmod -R 644。 - 密码存储:使用
bcrypt()或Hash::make(),不要用MD5。 - HTTPS:全站强制HTTPS。
- 日志:配置好
config/logging.php,记录所有异常和订单操作。
第五阶段:性能优化
- 数据库:对
order.user_id,product_skus.product_id建索引。 - 缓存:商品详情页缓存到Redis,TTL设置为1小时。
- 队列:发送邮件、订单处理、生成报表用 Laravel Horizon。
- CDN:静态资源(图片、CSS、JS)放阿里云/腾讯云OSS + CDN。
总结建议:是“手写”还是“用开源”?
| 你的情况 | 建议方案 | 理由 |
|---|---|---|
| 练手、学习 | 从零写Laravel + 简单功能 | 深入理解底层 |
| 公司快速上线、预算有限 | 使用开源系统:Laravel + Shopper 或 WooCommerce | 功能全有,开箱即用,成本低 |
| 要求高度定制化、长期迭代 | 基于 Laravel 手写+集成包 | 骨架清晰,业务可控,易扩展 |
| 无技术团队、个人站长 | WordPress + WooCommerce 或 OpenCart | 安装简单,插件多,后台友好 |
最后的推荐:如果你是PHP开发者且想快速上线一个靠谱的商城,不要自己重写支付和权限,利用 Laravel框架 + yansongda/pay 支付库 + spatie/laravel-permission 权限库 + Redis,可以让你在1-2周内搭建出功能完备、性能尚可的商城基础版。