php单一入口实现
单一入口实现原理
PHP单一入口模式通过一个中心脚本(如index.php)处理所有请求,根据URL参数或路径分发到不同控制器。这种方式便于统一管理权限、日志、错误处理等公共逻辑。
基本实现步骤
创建入口文件index.php:
<?php
// 定义应用目录常量
define('APP_PATH', dirname(__FILE__));
// 加载配置文件
require APP_PATH . '/config.php';
// 获取请求路径
$request = $_SERVER['REQUEST_URI'];
$script = $_SERVER['SCRIPT_NAME'];
// 移除基础路径和查询参数
$path = str_replace(dirname($script), '', $request);
$path = strtok($path, '?');
// 路由解析
$route = explode('/', trim($path, '/'));
$controller = !empty($route[0]) ? $route[0] : 'home';
$action = !empty($route[1]) ? $route[1] : 'index';
// 安全过滤
$controller = preg_replace('/[^a-z0-9_]/i', '', $controller);
$action = preg_replace('/[^a-z0-9_]/i', '', $action);
// 加载控制器文件
$controller_file = APP_PATH . "/controllers/{$controller}.php";
if (file_exists($controller_file)) {
require $controller_file;
$controller_class = ucfirst($controller) . 'Controller';
if (class_exists($controller_class)) {
$instance = new $controller_class();
if (method_exists($instance, $action)) {
$instance->$action();
exit;
}
}
}
// 404处理
header("HTTP/1.0 404 Not Found");
echo '404 Not Found';
控制器示例
创建controllers/home.php:
<?php
class HomeController {
public function index() {
echo 'Welcome to homepage';
}
public function about() {
echo 'About us page';
}
}
URL重写配置
Apache的.htaccess示例:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]
Nginx配置示例:
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
进阶优化方案
使用composer加载器实现自动加载:
require 'vendor/autoload.php';
实现依赖注入容器:
$container = new Container();
$container->set('db', function() {
return new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
});
框架推荐方案
对于生产环境,建议使用成熟框架的单一入口实现:
- Laravel:public/index.php
- Symfony:web/app.php
- ThinkPHP:public/index.php
这些框架已内置完善的路由、中间件和依赖管理机制,避免重复造轮子。







