php启动流程,启动流程 · TP5源代码阅读 · 看云

本文详细解读ThinkPHP框架启动过程,从入口文件public/index.php开始,经过框架引导(thinkphp/start.php)定义常量和自动加载,再到默认配置加载,最终到达应用启动(thinkphp/library/App.php)的请求分析、调度与数据输出。
摘要由CSDN通过智能技术生成

[TOC]

* * * * *

#1 启动概述

* 启动的总流程按照文件分为三步

* 1 请求入口(public/index.php)

* 2 框架启动(thinkphp/start.php)

* 3 应用启动 (thinkphp/library/App.php)

#2 入口文件(public/index.php)

~~~

// 定义应用目录

define('APP_PATH', __DIR__ . '/../application/');

// 加载框架引导文件

require __DIR__ . '/../thinkphp/start.php';

~~~

> 默认的入口文件在public/index.php

>> 主要定义应用目录,加载框架引导文件(thinkphp/start.php)

#3 框架启动(thinkphp/start.php)

## 3-1 框架引导(thinkphp/start.php)

~~~

// 加载基础文件

require __DIR__ . '/base.php';

// 执行应用

App::run()->send();

~~~

> 框架引导文件(thinkphp/start.php)

>>主要用来启动框架

>>按照涉及的文件分为以下三步

>>1 定义全局变量与注册自动加载

>>2 加载默认配置

>>3 启动应用

## 3-2 定义全局常量(thinkphp/base.php)

~~~

define('THINK_VERSION', '5.0.0');

define('THINK_START_TIME', microtime(true));

define('THINK_START_MEM', memory_get_usage());

define('EXT', '.php');

define('DS', DIRECTORY_SEPARATOR);

defined('THINK_PATH') or define('THINK_PATH', __DIR__ . DS);

define('LIB_PATH', THINK_PATH . 'library' . DS);

define('CORE_PATH', LIB_PATH . 'think' . DS);

define('TRAIT_PATH', LIB_PATH . 'traits' . DS);

defined('APP_PATH') or define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']) . DS);

defined('ROOT_PATH') or define('ROOT_PATH', dirname(APP_PATH) . DS);

defined('EXTEND_PATH') or define('EXTEND_PATH', ROOT_PATH . 'extend' . DS);

defined('VENDOR_PATH') or define('VENDOR_PATH', ROOT_PATH . 'vendor' . DS);

defined('RUNTIME_PATH') or define('RUNTIME_PATH', ROOT_PATH . 'runtime' . DS);

defined('LOG_PATH') or define('LOG_PATH', RUNTIME_PATH . 'log' . DS);

defined('CACHE_PATH') or define('CACHE_PATH', RUNTIME_PATH . 'cache' . DS);

defined('TEMP_PATH') or define('TEMP_PATH', RUNTIME_PATH . 'temp' . DS);

defined('CONF_PATH') or define('CONF_PATH', APP_PATH); // 配置文件目录

defined('CONF_EXT') or define('CONF_EXT', EXT); // 配置文件后缀

defined('ENV_PREFIX') or define('ENV_PREFIX', 'PHP_'); // 环境变量的配置前缀

// 环境常量

define('IS_CLI', PHP_SAPI == 'cli' ? true : false);

define('IS_WIN', strpos(PHP_OS, 'WIN') !== false);

~~~

>>基础文件(thinkphp/base.php)

>>开始部分定义了框架的全局常量

>>包括框架的运行信息,目录组织,运行环境等

## 3-3 注册自动加载(thinkphp/base.php)

~~~

// 载入Loader类

require CORE_PATH . 'Loader.php';

// 加载环境变量配置文件

if (is_file(ROOT_PATH . '.env')) {

$env = parse_ini_file(ROOT_PATH . '.env', true);

foreach ($env as $key => $val) {

$name = ENV_PREFIX . strtoupper($key);

if (is_array($val)) {

foreach ($val as $k => $v) {

$item = $name . '_' . strtoupper($k);

putenv("$item=$v");

}

} else {

putenv("$name=$val");

}

}

}

// 注册自动加载

\think\Loader::register();

// 注册错误和异常处理机制

\think\Error::register();

~~~

>> 基础文件(thinkphp/base.php)

>> 中间部分加载环境配置,

>> 启动自动加载

>> 注册自定义错误与异常处理

## 3-4 加载框架默认配置(thinkphp/convention.php)

~~~

\think\Config::set(include THINK_PATH . 'convention' . EXT);

~~~

>>基础文件(thinkphp/base.php)

>>最后加载框架默认配置

## 3-5 框架默认配置(thinkphp/convention.php)

~~~

应用设置

模块设置

URL设置

模板设置

异常及错误设置

日志设置

Trace设置

缓存设置

会话设置

Cookie设置

数据库设置

分页配置

~~~

>>以数组形式实现框架默认配置

>>相关配置信息可以在应用目录(application/)中进行覆盖

#4 应用启动(thinkphp/library/App.php)

## 4-1 请求分析(App.php->run())

~~~

App.php;

public static function run(Request $request = null)

is_null($request) && $request = Request::instance();

$config = self::initCommon();

if (defined('BIND_MODULE')) {

// 模块/控制器绑定

BIND_MODULE && Route::bind(BIND_MODULE);

} elseif ($config['auto_bind_module']) {

// 入口自动绑定

$name = pathinfo($request->baseFile(), PATHINFO_FILENAME);

if ($name && 'index' != $name && is_dir(APP_PATH . $name)) {

Route::bind($name);

}

}

$request->filter($config['default_filter']);

。。。。。。

}

~~~

>> 应用启动的请求分析

>> 首先 创建请求对象(Request)

>> 然后 解析请求的模块信息

>> 最后 过滤请求信息

## 4-2 应用调度(App.php->run())

~~~

App.php;

public static function run(Request $request = null)

。。。。。。

try {

// 开启多语言机制

if ($config['lang_switch_on']) {

// 获取当前语言

$request->langset(Lang::detect());

// 加载系统语言包

Lang::load(THINK_PATH . 'lang' . DS . $request->langset() . EXT);

if (!$config['app_multi_module']) {

Lang::load(APP_PATH . 'lang' . DS . $request->langset() . EXT);

}

}

// 获取应用调度信息

$dispatch = self::$dispatch;

if (empty($dispatch)) {

// 进行URL路由检测

$dispatch = self::routeCheck($request, $config);

}

// 记录当前调度信息

$request->dispatch($dispatch);

// 记录路由和请求信息

if (self::$debug) {

Log::record('[ ROUTE ] ' . var_export($dispatch, true), 'info');

Log::record('[ HEADER ] ' . var_export($request->header(), true), 'info');

Log::record('[ PARAM ] ' . var_export($request->param(), true), 'info');

}

// 监听app_begin

Hook::listen('app_begin', $dispatch);

switch ($dispatch['type']) {

case 'redirect':

// 执行重定向跳转

$data = Response::create($dispatch['url'], 'redirect')->code($dispatch['status']);

break;

case 'module':

// 模块/控制器/操作

$data = self::module($dispatch['module'], $config, isset($dispatch['convert']) ? $dispatch['convert'] : null);

break;

case 'controller':

// 执行控制器操作

$data = Loader::action($dispatch['controller']);

break;

case 'method':

// 执行回调方法

$data = self::invokeMethod($dispatch['method']);

break;

case 'function':

// 执行闭包

$data = self::invokeFunction($dispatch['function']);

break;

case 'response':

$data = $dispatch['response'];

break;

default:

throw new \InvalidArgumentException('dispatch type not support');

}

} catch (HttpResponseException $exception) {

$data = $exception->getResponse();

}

。。。。。。

}

~~~

>>应用启动的应用调度

>>首先 检查语言配置

>>然后 路由解析获取调度信息

>>最后 根据调度类型执行不同类型应用

## 4-3 数据输出(App.php->run())

~~~

App.php;

public static function run(Request $request = null)

// 清空类的实例化

Loader::clearInstance();

// 输出数据到客户端

if ($data instanceof Response) {

$response = $data;

} elseif (!is_null($data)) {

// 默认自动识别响应输出类型

$isAjax = $request->isAjax();

$type = $isAjax ? Config::get('default_ajax_return') : Config::get('default_return_type');

$response = Response::create($data, $type);

} else {

$response = Response::create();

}

// 监听app_end

Hook::listen('app_end', $response);

return $response;

。。。。。。

}

~~~

>>应用逻辑执行完后,

>>首先 清空应用执行过程创建的对象

>>然后 根据应用执行后返回的数据创建响应对象(Response)

>>最后 调用相应对象的send()输出数据到客户端(start.php文件中)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: tp5商城项目源代码是一种基于ThinkPHP框架的商城系统的源代码,用于作为毕业设计小学期项目的开发实践。 商城项目源代码包含了一个完整的电子商务系统的代码实现,涵盖了常见的商城功能,如用户管理、商品管理、订单管理等。该项目的主要目的是让学生通过实际开发来加深对软件工程的理解和应用。 在该项目中,学生可以学习和应用诸如需求分析、系统设计、数据库设计、编码实现、测试调试等软件工程的相关知识。通过深入研究和实践,学生可以更好地理解并掌握开发一个实际项目的全过程,加强自己的项目管理与协作能力。 同时,该项目也可以帮助学生学习和掌握ThinkPHP框架的使用。ThinkPHP是一款成熟的PHP框架,具有良好的可维护性和易于扩展的特点。通过使用ThinkPHP来开发商城项目,学生可以了解和应用框架的各种功能和特性,提高开发效率和代码质量。 综上所述,tp5商城项目源代码是一种具有实践意义的毕业设计小学期项目,可以通过开发实践加深对软件工程和ThinkPHP框架的理解和应用,提升学生的综合能力和就业竞争力。 ### 回答2: tp5商城项目源代码毕设小学期是指用thinkphp5框架编写的一个商城项目的源代码,在毕业设计中作为小学期的一个重要内容。该商城项目是以tp5框架为基础,结合数据库、前端页面设计和后台管理系统的完整开发流程。 该项目的实现主要分为前台和后台两个部分。前台是用户访问和购物的主要界面,包括商品展示、购物车、订单提交、支付等功能。后台是管理员进行商品管理、订单管理、用户管理等操作的界面。 在项目的源代码中,通过模块化的方式,将整个商城项目划分为多个独立的模块,方便开发和维护。在实现过程中,使用了thinkphp5框架提供的MVC架构,使用了数据库操作、HTTP请求、数据验证、缓存等多种功能和扩展。 在小学期的毕设中,通过对tp5商城项目源代码的开发,可以学习到前后端开发流程,了解项目需求分析、数据库设计、系统架构设计和代码编写等全过程。同时,还可以掌握thinkphp5框架的应用和使用,提升对PHP编程语言的理解和运用能力。 通过毕设小学期的实践,学生可以深入了解商城项目的开发流程,掌握软件工程实践技巧,培养项目开发和团队协作能力。同时,还能够提升对互联网技术和市场需求的了解,为未来的职业发展打下坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值