php如何实现单一入口
单一入口的实现原理
单一入口指所有请求通过一个入口文件(如index.php)处理,再由该文件根据路由规则分发到不同的功能模块。这种方式便于统一管理权限、日志、安全过滤等。
创建入口文件
在项目根目录创建index.php作为入口文件,内容如下:
<?php
// 定义应用目录常量
define('APP_PATH', __DIR__ . '/app/');
// 引入路由处理文件
require APP_PATH . 'router.php';
配置URL重写
对于Apache服务器,在项目根目录创建.htaccess文件:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>
Nginx服务器需在配置中添加:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
设计路由解析
在app/router.php中实现路由解析逻辑:
$url = isset($_GET['url']) ? $_GET['url'] : 'home';
$urlParts = explode('/', rtrim($url, '/'));
$controller = !empty($urlParts[0]) ? $urlParts[0] : 'home';
$action = isset($urlParts[1]) ? $urlParts[1] : 'index';
$params = array_slice($urlParts, 2);
实现自动加载
使用spl_autoload_register实现类自动加载:
spl_autoload_register(function ($className) {
$file = APP_PATH . str_replace('\\', '/', $className) . '.php';
if (file_exists($file)) {
require $file;
}
});
控制器调度
在路由文件中添加控制器调用逻辑:
$controllerName = ucfirst($controller) . 'Controller';
if (class_exists($controllerName)) {
$controllerInstance = new $controllerName();
if (method_exists($controllerInstance, $action)) {
call_user_func_array([$controllerInstance, $action], $params);
} else {
header("HTTP/1.0 404 Not Found");
}
} else {
header("HTTP/1.0 404 Not Found");
}
目录结构示例
典型的单一入口项目结构:
project/
├── index.php
├── .htaccess
└── app/
├── router.php
├── controllers/
│ ├── HomeController.php
│ └── ...
├── models/
└── views/
安全注意事项
在入口文件中添加基础安全防护:
// 过滤所有请求
$_GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING);
$_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
性能优化建议
启用OPcache缓存:
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
这种实现方式为后续功能扩展提供了统一的基础架构,同时保持了代码的整洁性和可维护性。







