Thinkphp路由源码分析

   摘要:把$_SERVER[‘PATH_INFO‘]字符串按照配置的URL_PATHINFO_DEPR进行切分,区分出模块/控制器/方法 

  在lnmp环境下部署tp项目时,按照网上某资料nginx的配置文件修改了三个参数:PATH_INFO,SCRIPT_NAME,SCRIPT_FILENAME,系统已经可以正常运行。但是为什么不修改request_uri等其他参数呢?是不是这些参数没影响tp的路由策略?(注意:通过rewrite方式访问时,request_uri没有index.php这一部分)

  带着这些疑问,我分析了tp的源码,发现在路由解析这一部分主要依赖$_SERVER[‘PATH_INFO‘]参数,另外两个参数在其他地方用到了,暂且不谈!从入口文件一直跟踪到Dispatcher::dispatch方法

/index.php==>/ThinkPHP/ThinkPHP.php==>/ThinkPHP/Library/Think/Think.clas.php/(run)==>ThinkPHP/Library/Think/App.class.php(init)==>

ThinkPHP/Library/Think/Dispatcher.class.php(dispatch)

  下面是一些重点分析:

/*********************   获取控制器  *****************************/
define(‘__INFO__‘, trim($_SERVER[‘PATH_INFO‘], ‘/‘));//!!$_SERVER[‘PATH_INFO‘]出现了
// URL后缀
define(‘__EXT__‘, strtolower(pathinfo($_SERVER[‘PATH_INFO‘], PATHINFO_EXTENSION)));
$_SERVER[‘PATH_INFO‘] = __INFO__;
if (!defined(‘BIND_MODULE‘) && (!C(‘URL_ROUTER_ON‘) || !Route::check())) {
    if (__INFO__ && C(‘MULTI_MODULE‘)) { // 获取模块名
        $paths = explode($depr, __INFO__, 2);
        $allowList = C(‘MODULE_ALLOW_LIST‘); // 允许的模块列表
        $module = preg_replace(‘/\.‘ . __EXT__ . ‘$/i‘, ‘‘, $paths[0]);
        if (empty($allowList) || (is_array($allowList) && in_array_case($module, $allowList))) {
            $_GET[$varModule] = $module;                //!!!重新設置$_GET[‘m‘]=module_name
            $_SERVER[‘PATH_INFO‘] = isset($paths[1]) ? $paths[1] : ‘‘;//!!!此时的$_SERVER[‘PATH_INFO‘]已经去掉了控制器所在的那一部分
        }
    }
}
/****************** 获取控制器和动作 ************************/
$depr   =   C(‘URL_PATHINFO_DEPR‘);$paths  =   explode($depr,trim($_SERVER[‘PATH_INFO‘],$depr));if(!defined(‘BIND_CONTROLLER‘)) {// 获取控制器    if(C(‘CONTROLLER_LEVEL‘)>1){// 控制器层次        $_GET[$varController]   =   implode(‘/‘,array_slice($paths,0,C(‘CONTROLLER_LEVEL‘)));        $paths  =   array_slice($paths, C(‘CONTROLLER_LEVEL‘));    }else{        $_GET[$varController]   =   array_shift($paths);//!!!获取控制器    }}// 获取操作if(!defined(‘BIND_ACTION‘)){    $_GET[$varAction]  =   array_shift($paths);//!!!获取方法}
// 获取控制器和操作名define(‘CONTROLLER_NAME‘,   defined(‘BIND_CONTROLLER‘)? BIND_CONTROLLER : self::getController($varController,$urlCase));define(‘ACTION_NAME‘,       defined(‘BIND_ACTION‘)? BIND_ACTION : self::getAction($varAction,$urlCase));
时间: 2025-01-02 17:24:24

Thinkphp路由源码分析的相关文章

thinkphp 源码分析(一)

在工作中,我接触到了国人开发的thinkphp框架,也许对于大多数童鞋来说,就是简单的用用,但是作为一名技术的爱好者,还是不放弃一丝希望,认真的开始读thinkphp的源码,但是对于很多的牛牛们来说,很简单,so easy!我是菜鸟,我需要的更多的学习的地方.作为以后的复习的笔记,保存一份,我平时太懒,一般不想去写博客:如果有php或者架构的同仁.欢迎加入我们的群:13768387 首先,我说一下,thinkphp的版本,我认为一个经典的版本是3.1.3,但是目前工作是这个经典版本和3.2版本,

RocketMQ 源码分析

RocketMQ 源码分析 RocketMQ 的设计思想来自于Kafka,在具体设计时体现了自己的选择和需求,具体差别可以看RocketMQ与Kafka对比(18项差异).接下来记录下自己阅读源码的一些探索. RocketMQ的整体架构如下,可以看到各个组件充当的角色,Name Server 负责维护一些全局的路由信息:当前有哪些broker,每个Topic在哪个broker上等; Broker具体处理消息的存储和服务:生产者和消费者是消息的源头和归宿. 在知道各个角色的基本位置后,就该让程序跑

keystone源码分析(一)——Paste Deploy的应用

本keystone源码分析系列基于Juno版Keystone,于2014年10月16日随Juno版OpenStack发布. Keystone作为OpenStack中的身份管理与授权模块,主要实现系统用户的身份认证.基于角色的授权管理.其他OpenStack服务的地址发现和安全策略管理等功能.Keystone作为开源云系统OpenStack中至关重要的组成部分,与OpenStack中几乎所有的其他服务(如Nova, Glance, Neutron等)都有着密切的联系.同时,Keystone作为开源

Backbone.js源码分析(珍藏版)

源码分析珍藏,方便下次阅读! // Backbone.js 0.9.2 // (c) 2010-2012 Jeremy Ashkenas, DocumentCloud Inc. // Backbone may be freely distributed under the MIT license. // For all details and documentation: // http://backbonejs.org (function () { // 创建一个全局对象, 在浏览器中表示为w

YII框架源码分析(百度PHP大牛创作-原版-无广告无水印)

                        YII 框架源码分析             百度联盟事业部--黄银锋   目 录 1. 引言 3 1.1.Yii 简介 3 1.2.本文内容与结构 3 2.组件化与模块化 4 2.1.框架加载和运行流程 4 2.2.YiiBase 静态类 5 2.3.组件 6 2.4.模块 9 2.5 .App 应用   10 2.6 .WebApp 应用   11 3.系统组件 13 3.1.日志路由组件  13 3.2.Url 管理组件  15 3.3.异常

cowboy源码分析(一)

前段时间导读了ranch的源码,具体见ranch 源码分析(一), 现在整理了下ranch框架下经典应用cowboy. 源码地方:https://github.com/ninenines/cowboy(目前使用的是cowboy-1.0.4版本) 还是找其中最简单的例子来入手,那就选这个static_world吧~~ 首先我们来看static_world_app.erl [[email protected] src]# cat static_world_app.erl %% Feel free t

MyCat源码分析系列之——SQL下发

更多MyCat源码分析,请戳MyCat源码分析系列 SQL下发 SQL下发指的是MyCat将解析并改造完成的SQL语句依次发送至相应的MySQL节点(datanode)的过程,该执行过程由NonBlockingSession.execute()触发: public void execute(RouteResultset rrs, int type) { // clear prev execute resources clearHandlesResources(); if (LOGGER.isDe

Californium 源码分析

1. Californium 项目简介 Californium 是一款基于Java实现的Coap技术框架,该项目实现了Coap协议的各种请求响应定义,支持CON/NON不同的可靠性传输模式.Californium 基于分层设计且高度可扩展,其内部模块设计及接口定义存在许多学习之处: 值得一提的是,在同类型的 Coap技术实现中,Californium的性能表现是比较突出的,如下图: 更多的数据可以参考Californium-可扩展云服务白皮书本文以框架的源码分析为主,其他内容不做展开. 2. 项

Backbone.js 0.9.2 源码分析收藏

Backbone 为复杂Javascript应用程序提供模型(models).集合(collections).视图(views)的结构.其中模型用于绑定键值数据和自定义事件:集合附有可枚举函数的丰富API: 视图可以声明事件处理函数,并通过RESRful JSON接口连接到应用程序. 源码分析转之网上它人的备注,特收藏一下,以免方便阅读. // Backbone.js 0.9.2 // (c) 2010-2012 Jeremy Ashkenas, DocumentCloud Inc. // Ba