php单一入口实现
单一入口实现原理
PHP单一入口模式通过一个中央脚本(如index.php)处理所有请求,利用URL参数或路由机制分发到不同控制器。这种架构统一了请求处理流程,便于集中管理权限、日志等横切关注点。
基本实现步骤
创建入口文件index.php,通常放置在项目根目录:
<?php
// 定义应用根目录常量
define('APP_PATH', dirname(__FILE__));
// 加载配置文件
require APP_PATH . '/config.php';
// 路由解析
$request = $_SERVER['REQUEST_URI'];
$route = parse_url($request, PHP_URL_PATH);
$route = trim($route, '/');
// 路由分发
switch ($route) {
case 'user/profile':
require APP_PATH . '/controllers/UserController.php';
$controller = new UserController();
$controller->profile();
break;
default:
require APP_PATH . '/controllers/HomeController.php';
$controller = new HomeController();
$controller->index();
}
改进路由机制
使用正则表达式实现动态路由匹配:
$routes = [
'#^user/(\d+)/profile$#' => function($userId) {
require 'controllers/UserController.php';
(new UserController())->profile($userId);
},
'#^article/([a-z0-9-]+)$#' => function($slug) {
require 'controllers/ArticleController.php';
(new ArticleController())->show($slug);
}
];
foreach ($routes as $pattern => $handler) {
if (preg_match($pattern, $route, $matches)) {
array_shift($matches);
call_user_func_array($handler, $matches);
exit;
}
}
现代框架实现方式
现代PHP框架通常采用更完善的路由组件:
// 使用FastRoute示例
$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) {
$r->addRoute('GET', '/users', 'UserController@index');
$r->addRoute('GET', '/user/{id:\d+}', 'UserController@show');
});
$httpMethod = $_SERVER['REQUEST_METHOD'];
$routeInfo = $dispatcher->dispatch($httpMethod, $route);
switch ($routeInfo[0]) {
case FastRoute\Dispatcher::FOUND:
$handler = $routeInfo[1];
$vars = $routeInfo[2];
list($class, $method) = explode('@', $handler);
call_user_func_array([new $class, $method], $vars);
break;
// 处理其他情况...
}
关键注意事项
URL重写需配置服务器(Apache示例):
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
Nginx配置示例:

location / {
try_files $uri $uri/ /index.php?$query_string;
}
优势与适用场景
- 统一安全控制点
- 集中式URL管理
- 便于实现MVC架构
- 适合中小型Web应用
- 框架基础架构的理想选择
对于大型项目,建议直接采用成熟的框架(如Laravel、Symfony)内置的路由系统,而非自行实现完整路由机制。






