本文目录导读:

在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接口了。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播