php实现httprouter
PHP 实现 HTTP 路由
在 PHP 中实现 HTTP 路由可以通过多种方式完成,以下是几种常见的方法:
使用原生 PHP 实现简单路由
通过解析 $_SERVER['REQUEST_URI'] 实现基本路由:
$request = $_SERVER['REQUEST_URI'];
switch ($request) {
case '/':
require 'home.php';
break;
case '/about':
require 'about.php';
break;
default:
http_response_code(404);
require '404.php';
break;
}
使用正则表达式实现动态路由
支持带参数的动态路由:
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
if (preg_match('#^/user/(\d+)$#', $uri, $matches)) {
$userId = $matches[1];
require 'user_profile.php';
} elseif ($uri === '/contact') {
require 'contact.php';
} else {
http_response_code(404);
require '404.php';
}
使用 Composer 包实现高级路由
安装流行的路由包如 nikic/FastRoute:
composer require nikic/fast-route
示例用法:
require 'vendor/autoload.php';
$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) {
$r->addRoute('GET', '/', 'HomeController@index');
$r->addRoute('GET', '/user/{id:\d+}', 'UserController@show');
});
$httpMethod = $_SERVER['REQUEST_METHOD'];
$uri = $_SERVER['REQUEST_URI'];
$routeInfo = $dispatcher->dispatch($httpMethod, $uri);
switch ($routeInfo[0]) {
case FastRoute\Dispatcher::NOT_FOUND:
// 404处理
break;
case FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
// 405处理
break;
case FastRoute\Dispatcher::FOUND:
$handler = $routeInfo[1];
$vars = $routeInfo[2];
// 调用控制器方法
break;
}
使用 Slim 框架的路由
安装 Slim 框架:
composer require slim/slim
路由示例:
require 'vendor/autoload.php';
$app = new \Slim\App;
$app->get('/', function ($request, $response) {
return $response->write('Home Page');
});
$app->get('/user/{id}', function ($request, $response, $args) {
return $response->write("User ID: " . $args['id']);
});
$app->run();
实现 RESTful API 路由
处理不同 HTTP 方法的路由:
$method = $_SERVER['REQUEST_METHOD'];
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
if ($method === 'GET' && $uri === '/api/users') {
// 获取用户列表
} elseif ($method === 'POST' && $uri === '/api/users') {
// 创建用户
} elseif ($method === 'PUT' && preg_match('#^/api/users/(\d+)$#', $uri, $matches)) {
// 更新用户
} elseif ($method === 'DELETE' && preg_match('#^/api/users/(\d+)$#', $uri, $matches)) {
// 删除用户
} else {
http_response_code(404);
echo json_encode(['error' => 'Not Found']);
}
路由缓存优化
对于生产环境,可以考虑缓存路由配置以提高性能:
$dispatcher = FastRoute\cachedDispatcher(function(FastRoute\RouteCollector $r) {
// 路由配置
}, [
'cacheFile' => __DIR__ . '/route.cache',
'cacheDisabled' => false, // 开发环境设为true
]);
以上方法涵盖了从简单到复杂的各种路由实现方式,可以根据项目需求选择合适的方案。







