本文目录导读:

这是一个非常庞大但也很系统的工程,用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周内搭建出功能完备、性能尚可的商城基础版。
版权声明: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直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播