PHP高性能API开发实战:构建现代化RESTful服务
一、现代PHP技术栈选型
高性能API开发核心组件:
- Laravel 10:现代化PHP框架
- Eloquent ORM:数据库操作
- Passport:OAuth2认证
- Redis:缓存与队列
- OpenAPI:API文档生成
二、项目初始化与配置
1. 创建Laravel项目
composer create-project laravel/laravel api-server
cd api-server
composer require laravel/passport
composer require darkaonline/l5-swagger
2. 数据库配置
// .env 配置示例
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=api_demo
DB_USERNAME=root
DB_PASSWORD=
CACHE_DRIVER=redis
QUEUE_CONNECTION=redis
三、核心架构实现
1. 数据模型与迁移
// 创建用户模型迁移
php artisan make:model User -m
// database/migrations/xxxx_create_users_table.php
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
// 产品模型
php artisan make:model Product -mcr
// app/Models/Product.php
class Product extends Model
{
protected $fillable = ['name', 'description', 'price'];
public function user()
{
return $this->belongsTo(User::class);
}
}
2. API认证配置
// 安装Passport
php artisan passport:install
// config/auth.php
'guards' => [
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
// User模型添加HasApiTokens
use LaravelPassportHasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
}
四、业务逻辑开发
1. 认证控制器
// app/Http/Controllers/AuthController.php
class AuthController extends Controller
{
public function register(Request $request)
{
$validated = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|string|email|unique:users',
'password' => 'required|string|min:8|confirmed',
]);
$user = User::create([
'name' => $validated['name'],
'email' => $validated['email'],
'password' => Hash::make($validated['password']),
]);
$token = $user->createToken('authToken')->accessToken;
return response()->json([
'user' => $user,
'access_token' => $token,
], 201);
}
public function login(Request $request)
{
$credentials = $request->validate([
'email' => 'required|email',
'password' => 'required',
]);
if (!Auth::attempt($credentials)) {
return response()->json(['message' => 'Unauthorized'], 401);
}
$user = $request->user();
$token = $user->createToken('authToken')->accessToken;
return response()->json([
'access_token' => $token,
'token_type' => 'Bearer',
]);
}
}
2. 产品API实现
// app/Http/Controllers/ProductController.php
class ProductController extends Controller
{
public function __construct()
{
$this->middleware('auth:api');
}
public function index()
{
return Product::with('user')
->orderBy('created_at', 'desc')
->paginate(10);
}
public function store(Request $request)
{
$validated = $request->validate([
'name' => 'required|string|max:255',
'description' => 'nullable|string',
'price' => 'required|numeric|min:0',
]);
$product = $request->user()->products()->create($validated);
return response()->json($product, 201);
}
public function show(Product $product)
{
return $product->load('user');
}
public function update(Request $request, Product $product)
{
$this->authorize('update', $product);
$validated = $request->validate([
'name' => 'sometimes|string|max:255',
'description' => 'nullable|string',
'price' => 'sometimes|numeric|min:0',
]);
$product->update($validated);
return response()->json($product);
}
public function destroy(Product $product)
{
$this->authorize('delete', $product);
$product->delete();
return response()->json(null, 204);
}
}
五、API文档与测试
1. OpenAPI文档生成
// 配置Swagger注释
/**
* @OAInfo(
* title="产品API文档",
* version="1.0.0",
* description="产品管理API文档"
* )
*/
// 控制器方法注释示例
/**
* @OAGet(
* path="/api/products",
* summary="获取产品列表",
* tags={"产品"},
* security={{"bearerAuth":{}}},
* @OAResponse(
* response=200,
* description="成功返回产品列表"
* )
* )
*/
// 生成文档
php artisan l5-swagger:generate
2. 性能优化技巧
// 使用缓存
public function index()
{
return Cache::remember('products.all', now()->addHour(), function () {
return Product::with('user')
->orderBy('created_at', 'desc')
->paginate(10);
});
}
// 使用队列处理耗时任务
ProcessProductImage::dispatch($product)->onQueue('images');
// 使用数据库索引优化查询
Schema::table('products', function (Blueprint $table) {
$table->index('name');
$table->index('price');
});