0

0

PHP架构里路由是怎么工作的_原理与应用【解答】

星夢妙者

星夢妙者

发布时间:2025-12-31 14:28:02

|

155人浏览过

|

来源于php中文网

原创

PHP路由本质是将$_SERVER['REQUEST_URI']按规则映射到函数或方法,需Web服务器重写所有非静态请求至index.php,并通过解析路径、正则匹配提取控制器/动作/参数,路由应专注分发,权限校验等交由中间件处理。

php架构里路由是怎么工作的_原理与应用【解答】

PHP 路由不是框架“自带的魔法”,而是你主动设计的一套请求分发逻辑——它本质是把 $_SERVER['REQUEST_URI'] 这个字符串,按规则映射到某个函数或控制器方法上执行。


入口文件怎么接管所有请求?

Web 服务器(Apache/Nginx)必须把非静态资源的请求全部转给 index.php,否则路由代码根本没机会运行。

  • Apache:靠 .htaccess 开启重写
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
  • Nginx:用 try_files 指令兜底
    location / {
      try_files $uri $uri/ /index.php?$query_string;
    }

⚠️ 容易踩的坑:

  • 忘记开启 Apache 的 mod_rewrite,导致 404 或直接暴露 PHP 文件
  • Nginx 配置里漏了 $query_string,GET 参数丢失
  • 静态资源(CSS/JS/图片)被错误重写,造成加载失败 → 必须加 !-f!-d 判断

怎么从 URL 提取控制器和方法?

原始路径如 /user/profile/123?tab=posts,得先标准化再拆解:

立即学习PHP免费学习笔记(深入)”;

  • 去掉查询参数:parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)
  • 去掉入口脚本名(如 /index.php)避免干扰
  • / 分割,跳过空段(开头斜杠会导致首项为空)

常见做法是约定前两段为 控制器/动作,其余为参数:

$parts = array_filter(explode('/', $path));
$controller = $parts[0] ?? 'Home';
$action = $parts[1] ?? 'index';
$params = array_slice($parts, 2);

⚠️ 注意点:

Android 应用框架原理与程序设计36技pdf繁体版
Android 应用框架原理与程序设计36技pdf繁体版

Android应用框架原理与程序设计36技 pdf繁体版,书籍内容适用于Android 1.0,有些朋友可能对Android还不太熟悉吧?不知您是否听说过Google 在HTC定制的高端手机呢?其操作系统是基于Android的,如果还是不太清楚的话,可以Google一下“HTC g2”手机,可以大致了解一下手机操作系统的界面及架构特点。不管怎么说,Android手机编程目前还是主要面向高端,在将来可能会普及,因此Android编程还是很有必要掌握的。

下载
  • 不要直接用 $_GET 拆路径,那是查询参数,不是路由参数
  • array_filter() 必须加,否则 ['', 'user', 'profile'] 会错位
  • 如果路径是 /api/v1/users,硬拆成三段就崩了 → 动态路由需正则匹配,不能只靠 explode

为什么正则路由比静态数组更实用?

静态数组(['/user' => 'UserController@index'])只适合 demo。真实项目要支持:

  • /user/123 → 提取 id=123
  • /post/hello-world → 提取 slug=hello-world
  • /api/v2/users → 匹配前缀并透传版本号

所以得用正则逐条匹配:

$routes = [
  '#^/user/(\d+)$#' => ['UserController', 'show'],
  '#^/post/([a-z0-9\-]+)$#' => ['PostController', 'view'],
];

foreach ($routes as $pattern => [$ctrl, $act]) { if (preg_match($pattern, $path, $matches)) { array_shift($matches); // 去掉完整匹配项 $params = $matches; require "controllers/{$ctrl}.php"; (new $ctrl())->$act(...$params); exit; } }

⚠️ 关键细节:

  • 正则必须用 #~ 做分隔符,避免和 URL 中的 / 冲突
  • preg_match 返回的是匹配结果数组,$matches[0] 是全量匹配,真正参数从 $matches[1] 开始
  • 没匹配成功时别忘了 http_response_code(404),否则默认返回 200 + 空白页

路由性能差,是不是该换 trie 树?

简单项目用 foreach + 正则完全够用;但当路由规则超 50 条、QPS 上千时,线性遍历确实成瓶颈。

  • trie(字典树)适合前缀匹配,比如 /api/v1//api/v2/ 共享节点
  • radix 树(如 Gin、Echo 用的)还能压缩公共路径,匹配更快
  • 但 PHP 原生没内置,自己实现容易出 bug;小项目不如加一层 APCu 缓存编译后的正则
// 缓存一次解析结果,避免重复 preg_match
$cacheKey = md5($path);
if ($cached = apcu_fetch($cacheKey)) {
  [$ctrl, $act, $params] = $cached;
} else {
  // 执行匹配逻辑...
  apcu_store($cacheKey, [$ctrl, $act, $params], 60);
}

真正卡顿往往不在匹配本身,而在:

  • 每次请求都 require 控制器文件(应提前 autoload)
  • 路由里做了 DB 查询或远程调用(应移入控制器,路由只做分发)
  • 忘记 exit/return,后续代码继续执行造成意外输出

路由最常被忽略的,是它不该承担权限校验、日志记录、输入过滤——这些是中间件的事。把它当成纯粹的“URL→函数”调度器,结构才清晰、才好测、才不会越写越重。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

1938

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1279

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1185

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

948

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1400

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1229

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1439

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1303

2023.11.13

小游戏4399大全
小游戏4399大全

4399小游戏免费秒玩大全来了!无需下载、即点即玩,涵盖动作、冒险、益智、射击、体育、双人等全品类热门小游戏。经典如《黄金矿工》《森林冰火人》《狂扁小朋友》一应俱全,每日更新最新H5游戏,支持电脑与手机跨端畅玩。访问4399小游戏中心,重温童年回忆,畅享轻松娱乐时光!官方入口安全绿色,无插件、无广告干扰,打开即玩,快乐秒达!

30

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.1万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号