审计工作准备真的折磨我,记录一下方便我复习也方便你们学习
首先是TP源码下载
安装php环境就不说了,,,
安装composer
在命令执行窗口输入
curl -sS https://getcomposer.org/installer | php
这个位置是保存的目录,也就是你CMD打开的目录
下载后,检查Composer是否能正常工作,只需要通过 php 来执行 PHAR:
php composer.phar
这样就是成功了,然后将composer.phar 移动到bin目录下并改名为composer:
Composer安装好之后,打开命令行,切换到你的web根目录下面并执行下面的命令:
composer create-project topthink/think=5.1.20 tp5.1.20 --prefer-dist
如果想要切换到其他版本,修改版本号即可,验证是否可以正常运行,在浏览器输入:
http://localhost/tp5.1.20/public/
IDE环境搭建及xdebug配置
安装phpstorm!用了的都说好phpstorm安装就不讲了,讲一下Xdebug怎么安装配置
Xdebug是一个开放源代码的PHP程序调试器,可以用来跟踪,调试和分析PHP程序的运行状况。在调试分析代码时,xdebug十分好用。
- 在chrome拓展商店里下载xdebug helper https://chrome.google.com/webstore/detail/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc
- 打开php.ini文件,添加xdebug相关配置
[xdebug]
xdebug.remote_enable = 1
xdebug.remote_handler = dbgp
xdebug.remote_host = 127.0.0.1
xdebug.remote_port = 9000 #端口号可以修改,避免冲突
xdebug.idekey = PHPSTROM
然后重启服务
然后配置phpstorm,让它可以debug(他不是一个成熟的phpstorm,不能自己debug)首先使用组合键Ctrl+Alt+S
在选择PHP执行文件的时候,会显示 “Debugger:Xdebug”,如果没有的话,点击open打开配置文件。把前面的注释,也就是分号去掉
然后配置php环境下的debug;Port和配置文件中的xdebug.remote_port要一致。
填写的内容和上面php.ini内的相对应。
配置服务器,点+号添加
配置配置debug模式
然后验证一下就行了
Xdebug使用
开启监听,然后下一个断点,在浏览器运行,就停在断点了
框架流程分析
下面详细记录几个位置,入口文件index.php非常简洁,只有三行代码。首先定义了一下命名空间,然后加载一些基础文件后,就开始执行应用。
第二行引入base.php基础文件,加载了Loader类,然后注册了一些机制–如自动加载功能、错误异常的机制、日志接口、注册类库别名。
这些机制中比较重要的一个是自动加载功能,系统会调用 Loader::register()方法注册自动加载,在这一步完成后,所有符合规范的类库(包括Composer依赖加载的第三方类库)都将自动加载。
首先需要注册自动加载功能,注册主要由以下几部分组成:
- 注册系统的自动加载方法 \think\Loader::autoload
- 注册系统命名空间定义
- 加载类库映射文件(如果存在)
- 如果存在Composer安装,则注册Composer自动加载
- 注册extend扩展目录
在加载完这些基础功能之后,程序就会开始执行应用,它通过调用app类中的run()方法去实例化app类。 在run()方法中,包含了应用执行的整个流程。
- $this->initialize(),首先会初始化一些应用。例如:加载配置文件、设置路径环境变量和注册应用命名空间等等。
- this->hook->listen(‘app_init’); 监听app_init应用初始化标签位。Thinkphp中有很多标签位置,也可以把这些标签位置称为钩子,在每个钩子处我们可以配置行为定义,通俗点讲,就是你可以往钩子里添加自己的业务逻辑,当程序执行到某些钩子位置时将自动触发你的业务逻辑。
- 模块\入口绑定
进行一些绑定操作,这个配置就会执行,默认情况下,这两个判断条件均为false
- $this->hook->listen(‘app_dispatch’);监听app_dispatch应用调度标签位。和2中的标签位同理,所有标签位作用都是一样的,都是定义一些行为,只不过位置不同,定义的一些行为的作用也有所区别。
- $dispatch = $this->routeCheck()->init(); 开始路由检测,检测的同时会对路由进行解析,利用array_shift函数一一获取当前请求的相关信息(模块、控制器、操作等)。
- dispatch);记录当前的调度信息,保存到request对象中。
- 记录路由和请求信息
如果开启了debug模式,会把当前的路由和请求信息记录到日志中。
- $this->hook->listen(‘app_begin’); 监听app_begin(应用开始标签位)。
- 根据获取的调度信息执行路由调度
期间会调用Dispatch类中的exec()方法对获取到的调度信息进行路由调度并最终获取到输出数据response返回,最后调用Response类中send()方法,发送数据到客户端,将数据输出到浏览器页面上。 在应用的数据响应输出之后,系统会进行日志保存写入操作,并最终结束程序运行。
-
命名空间特性
ThinkPHP5.1遵循PSR-4自动加载规范,只需要给类库正确定义所在的命名空间,并且命名空间的路径与类库文件的目录一致,那么就可以实现类的自动加载。
例如,\think\cache\driver\File类的定义为:
namespace think\cache\driver;
class File
{
}
如果我们实例化该类的话,应该是:
$class = new \think\cache\driver\File();
系统会自动加载该类对应路径的类文件,其所在的路径是 thinkphp/library/think/cache/driver/File.php。
可是为什么路径是在thinkphp/library/think下呢?这就要涉及要另一个概念—根命名空间。
跟命名空间特性
根命名空间是一个关键的概念,以上面的\think\cache\driver\File类为例,think就是一个根命名空间,其对应的初始命名空间目录就是系统的类库目录(thinkphp/library/think),我们可以简单的理解一个根命名空间对应了一个类库包。
系统内置的几个根命名空间(类库包)如下:
名称 | 描述 | 根库目录 |
---|---|---|
think | 系统核心类库 | thinkphp/library/think |
traits | 系统Trait类库 | thinkphp/library/traaits |
app | 应用类库 | Application |
URL访问
1.PATHINFO模式
http://域名/项目名/入口文件/模块名/方法名/键1/值1/键2/值2
如果要修改 URL中的 “/” 可以在配置文件中添加 'URL_PATHINFO_DEPR'=>'-'
├─application 应用目录(可设置)
│ ├─index 模块目录(可更改)
│ │ ├─controller 控制器目录
│ │ |–Index.php
<?php
namespace app\index\controller;
class Index
{
public function index()
{
return '姜小孩在线学TP框架和MVC模式';
}
}
这时候url访问方法为
http://localhost/tp5/index.php/index/index/index
如果修改index方法为hello:
<?--application/index/controller/Index.php -->
<?php
namespace app\index\controller;//命名空间
class Index //index控制器
{
public function hello() //hello操作方法
{
return '姜小孩在线学TP框架和MVC模式';
}
}
?>
这时候访问url就应该是
http://localhost/TP5/index.php/index/index/hello
也就是调用了index下的controller的index.php的hello方法
2.普通模式
http://域名/项目名/入口文件?m=模块名&a=方法名&键1=值1&键2=值2
http://192.168.1.11/think/index.php?m=index&a=test
3.REWRITE模式
http://域名/项目名/模块名/方法名/键1/值1/键2/值2
需要修改 Apache 的配置文件 httpd.conf 文件
4.兼容模式
http://域名/项目名/入口文件?s=模块名/方法名/键1/值1/键2/值2
强调一点,在通过$_SERVER[‘PATH_INFO’]获取值时,系统会把’‘自动转换为’/',并且系统及版本之间应该不会有所差异)。
下面再分别介绍下入口文件、模块、控制器、操作、参数名/参数值。
- 入口文件
文件地址:public\index.php
作用:负责处理请求
- 模块(以前台为例)
模块地址:application\index
作用:网站前台的相关部分
- 控制器
控制器目录:application\index\controller
作用:书写业务逻辑
- 操作(方法)
在控制器中定义的方法
- 参数名/参数值
方法中的参数及参数值
例如我们要访问index模块下的Test.php控制器文件中的hello()方法。
那么可以输入http://servername/index.php/index(模块)/Test(控制器)/hello(方法)/name(参数名)/world(参数值)
还有Thinkphp的几种传参方式及差别。
PATHINFO: index.php/index/Test/hello/name/world
只能以这种方式传参。
兼容模式:
index.php?s=index/Test/hello/name/worldindex.php?s=index/Test/hello&name=world
当我们有两个变量b时,在兼容模式下还可以将两者结合传参:
index.php?s=index/Test/hello/a/1&b=2
URL解析流程
首先发起请求->开始路由检测->获取pathinfo信息->路由匹配->开始路由解析->获得模块、控制器、操作方法调度信息->开始路由调度->解析模块和类名->组建命名空间>查找并加载类->实例化控制器并调用操作方法->构建响应对象->响应输出->日志保存->程序运行结束
Q.E.D.