本文目录导读:

在PHP项目中实现API接口,通常有以下几种主流方式,从简单到复杂:
原生PHP实现(适合小型项目)
基础路由和响应
// api.php
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
// 简单的路由
$method = $_SERVER['REQUEST_METHOD'];
$path = $_SERVER['PATH_INFO'] ?? '/';
// 路由处理
switch($path) {
case '/users':
if($method === 'GET') {
echo json_encode(['data' => ['user1', 'user2']]);
}
break;
case '/users/create':
if($method === 'POST') {
$input = json_decode(file_get_contents('php://input'), true);
echo json_encode(['message' => 'User created']);
}
break;
default:
http_response_code(404);
echo json_encode(['error' => 'Not found']);
}
.htaccess 配置(Apache)
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ api.php/$1 [QSA,L]
使用框架(推荐主流方案)
Laravel(最流行)
// routes/api.php
Route::apiResource('users', UserController::class);
// 自定义路由
Route::get('/products', [ProductController::class, 'index']);
Route::post('/products', [ProductController::class, 'store']);
// 控制器
class UserController extends Controller {
public function index() {
return response()->json(User::all());
}
public function store(Request $request) {
$user = User::create($request->validate([
'name' => 'required|string',
'email' => 'required|email|unique:users'
]));
return response()->json($user, 201);
}
}
Lumen(Laravel的轻量版)
// routes/web.php
$router->get('/users', 'UserController@index');
$router->post('/users', 'UserController@store');
Slim(极简微框架)
require 'vendor/autoload.php';
$app = new \Slim\App();
$app->get('/users', function ($request, $response) {
return $response->withJson(['users' => []]);
});
$app->post('/users', function ($request, $response) {
$data = $request->getParsedBody();
return $response->withJson($data, 201);
});
$app->run();
核心实现要点
RESTful 设计规范
// 常见HTTP方法和用途 GET /users // 获取用户列表 GET /users/1 // 获取单个用户 POST /users // 创建用户 PUT /users/1 // 更新用户 DELETE /users/1 // 删除用户
请求处理
// 获取请求数据
$json = file_get_contents('php://input');
$data = json_decode($json, true);
// 获取查询参数
$page = $_GET['page'] ?? 1;
// 获取请求头
$token = $_SERVER['HTTP_AUTHORIZATION'] ?? '';
响应格式
// 成功响应
{
"status": "success",
"data": {
"id": 1,
"name": "John"
}
}
// 错误响应
{
"status": "error",
"message": "User not found",
"code": 404
}
状态码规范
200 - OK 201 - Created 204 - No Content 400 - Bad Request 401 - Unauthorized 403 - Forbidden 404 - Not Found 422 - Unprocessable Entity 500 - Internal Server Error
安全实现
API认证(JWT示例)
// 生成Token
$payload = [
'user_id' => 123,
'exp' => time() + 3600 // 1小时过期
];
$token = JWT::encode($payload, $secretKey);
// 验证Token
try {
$decoded = JWT::decode($token, $secretKey, ['HS256']);
// 处理请求
} catch (\Exception $e) {
http_response_code(401);
echo json_encode(['error' => 'Invalid token']);
}
输入验证
function validateInput($data) {
$errors = [];
if (empty($data['email'])) {
$errors['email'] = 'Email is required';
}
if (!filter_var($data['email'], FILTER_VALIDATE_EMAIL)) {
$errors['email'] = 'Invalid email format';
}
if (!empty($errors)) {
http_response_code(422);
echo json_encode(['errors' => $errors]);
exit;
}
}
速率限制(Rate Limiting)
// 简易实现
$ip = $_SERVER['REMOTE_ADDR'];
$cacheKey = "rate_limit:$ip";
$attempts = $cache->get($cacheKey) ?? 0;
if ($attempts >= 100) {
http_response_code(429);
echo json_encode(['error' => 'Too many requests']);
exit;
}
$cache->set($cacheKey, $attempts + 1, 3600);
最佳实践建议
使用Composer管理依赖
{
"require": {
"slim/slim": "^4.0",
"firebase/php-jwt": "^6.0",
"php-di/php-di": "^7.0"
}
}
数据库操作(PDO)
class UserAPI {
private $db;
public function __construct() {
$this->db = new PDO('mysql:host=localhost;dbname=api_db', 'user', 'pass');
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
public function getUsers() {
$stmt = $this->db->query('SELECT * FROM users');
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
}
错误处理
set_error_handler(function($severity, $message, $file, $line) {
throw new \ErrorException($message, 0, $severity, $file, $line);
});
set_exception_handler(function($exception) {
http_response_code(500);
echo json_encode([
'error' => 'Internal server error',
'message' => $exception->getMessage()
]);
});
日志记录
function logApiCall($method, $path, $statusCode) {
$log = [
'timestamp' => date('Y-m-d H:i:s'),
'method' => $method,
'path' => $path,
'status' => $statusCode,
'ip' => $_SERVER['REMOTE_ADDR']
];
file_put_contents('api.log', json_encode($log) . "\n", FILE_APPEND);
}
选择建议
| 场景 | 推荐方案 |
|---|---|
| 小型项目/快速原型 | 原生PHP 或 Slim |
| 中型项目 | Laravel 或 Lumen |
| 企业级项目 | Laravel |
| 微服务架构 | Lumen 或 Slim |
部署注意事项
- 关闭错误显示:
display_errors = Off - 启用HTTPS:强制使用SSL
- 设置CORS:按需配置跨域
- 使用.env:敏感信息不要硬编码
- 添加版本号:
/api/v1/users - 文档生成:使用Swagger/OpenAPI
这样,你就能根据项目规模选择合适的方案来实现PHP API接口了。