thinkphp第1课:使用thinkphp创建一个项目

Wesley13
• 阅读 994

一、thinkphp第一课:
1、在网站根目录下,建立一个项目名称orange;
2、在orange目录下,创建一个入口文件index.php:

3、下载thinkphp核心包并解压,放在网站根目录下(与orange同级,这样做的目的是为了方便多个项目调用。如果你只有一个项目,那么可以放在orange目录下)。我这里文件夹名改成了TP。
4、在浏览器打开 http://localhost/orange/,便可以看到thinkphp的欢迎页面了。
5、同时, 你也会发现,在orange目录下,创建了一系列的目录。

二、浏览器访问 http://localhost/orange/ 时,发生了什么?think的执行流程是怎么样的

(1)第一步:引入框架下的 thinkphp.php
<?php
// ThinkPHP 入口文件
//记录开始运行时间
$GLOBALS['_beginTime'] = microtime(TRUE);
// 记录内存初始使用
// PHP5.2及以后的版本,提供了一个编译选项,允许不编译此函数(memory_get_usage)。也就是有可能不存在此函数,所以先进行判断
define('MEMORY_LIMIT_ON',function_exists('memory_get_usage'));
if(MEMORY_LIMIT_ON) $GLOBALS['_startUseMems'] = memory_get_usage();
//计算当前应用页面的绝对地址(调用页面所在的目录)
//本实例:APP_PATH项目目录——>D:/www/Apache2.2/htdocs/orange/
defined('APP_PATH') or define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']).'/');
//计算出运行临时目录;如果手工设定RUNTIME_PATH,则以手工定义的常量为准
//本实例:RUNTIME_PATH临时目录——>D:/www/Apache2.2/htdocs/orange/Runtime/
defined('RUNTIME_PATH') or define('RUNTIME_PATH',APP_PATH.'Runtime/');
//是否开启调试选项,如果定义了常量,则以定义的为准;未定义,则为flase
//如果不开启调试,则在项目目录下有一个runtime.php的缓存。具体见框架目录下的runtime.php代码
//我们在本地做测试,需要在入口文件开启调试,即修改后立即生效,如果出错,页面会输出详细的错误信息
defined('APP_DEBUG') or define('APP_DEBUG',false); // 是否调试模式
//模式:不同的模式,生成不同的runtime.php。暂时用不着
//比如,定义一个mini,则生成
mini_runtime.php
$runtime = defined('MODE_NAME')?''.strtolower(MODE_NAME).'_runtime.php':'runtime.php';
//根据模式算出运行文件的路径 runtime.php
//本实例:RUNTIME_FILE运行文件的路径——>D:/www/Apache2.2/htdocs/orange/Runtime/
runtime.php
defined('RUNTIME_FILE') or define('RUNTIME_FILE',RUNTIME_PATH.$runtime);
if(!APP_DEBUG && is_file(RUNTIME_FILE)) {
// 部署模式直接载入运行缓存
require RUNTIME_FILE;
}else{ //第一次运行时,走这条路线
// 系统目录定义
defined('THINK_PATH') or define('THINK_PATH', dirname(__FILE__).'/');
// 加载运行时文件
//THINK_PATH 为框架的路径
require THINK_PATH.'Common/runtime.php';
}

thinkphp.php文件,定义了常量app_name和think_path(大写),并引入runtime.php

(2)第二步,加载框架下的 Common/runtime.php文件
1)、再次定义了一些常量,具体见源码;
2)、创建项目目录结构(由build_app_dir()方法创建;
3)、如果app_dubug设置为false,则把核心加载文件进行编译。否则,删除编译文件,即项目下的~runtime.php文件;
4)、调用框架TP下的 lib/core/Think.class.php 文件——>执行入口 Think::Start()。

(3)第三步,执行框架TP下的 lib/core/Think.class.php 的start()方法
1)、接第二步,开始执行入口文件Think::Start()。包括声明错误处理句柄、异常处理句柄,并声明类的自动加载机制;
2)、Think::buildApp(); //初始化app运行,即项目预编译,加载项目的各种配置文件,大约有10个文件左右。
3)、加载完配置文件后,执行app::run

(4)第四步,执行框架下的 lib/core/App.class.php下的run方法
1)、执行app下init()静态方法:分析url,得出调用哪个控制器。
2)、执行app下exec静态方法:根据计算出来的模型和方法,实例化该module,并执行action相应的方法。本实例找到的项目下 lib/action目录下的 IndexAction.class.php,并执行index()方法。

经过了以上这么多的步骤,我们终于是看到了浏览器上显示的 thinkphp欢迎页面。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
thinkphp3.2.3模板渲染支持三元表达式
thinkphp3.2.3模板渲染支持三元表达式{$status?'正常':'错误'}{$info'status'?$info'msg':$info'error'}注意:三元运算符中暂时不支持点语法。如下:           <divclass"modalhidefade"id'myModa
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这