数据空间 - 源码分析
type: channel
link: http://zmofun.com/tag/源码分析
items: Typecho 源码分析（转）

Typecho 源码分析（转）
type: item
date: 2020-12-25T04:04:00+00:00
description: Typecho 源码分析（1） 2019-11-06 22:15:03 crazyhl 2019-11-06 22:15:03 分类专栏： # typecho 源码分析 文章标签： php typecho 源码分析 先说点前置的东西 从今天开始我要开始写源码分析的文章了，以前用 csdn 博客写过一些 android 和 java 的东西，后来脑袋抽筋被我删除了。所以这次等于是全新的开始，准备输出一些东西了。做了 5 年的开发，发现自己缺乏很多东西，所以这次从源码分析开始，输出东西以及补充自己的知识。 为什么选用 typecho ？ 这个博客系统很经典，说是 cms 也不为过，毕竟他的对手 wordpress 也可以说是 cms 了，现在估计更多的企业都是用它来做展示站了。而不仅仅是博客。 也许会有朋友说，这么老的代码分析有何用？但是我想说虽然它没有用 composer，没有各种新奇的东西，而且还有很多 php 和 html 混排的代码。但是他的代码我认为我可以分析的比较清楚，没有更多外部的引用，让我们可以全身心的投入到它本身的代码中去。不用考虑各种引用的代码，让我们在深入进去，比如如果分析 laravel，就要分析很多引入库了。另外，这个代码的注释写的太好了。当然了，后续我也会分析这种代码的。 我分析的流程 分析代码有很多种 一个文件分析完，在分析另一个 遇到一个方法或者流程的改变就进入到相应方法或者流程 我在这边选用第二种，这样更符合我的风格 正文开始 进入 index.php /** 载入配置支持 */ if (!defined('__TYPECHO_ROOT_DIR__') && !@include_once 'config.inc.php') { file_exists('./install.php') ? header('Location: install.php') : print('Missing Config File'); exit; } 12345 如果没有定义 __TYPECHO_ROOT_DIR__ 并且 引入 config.inc.php 失败就进入判断。 这时候检测 ./install.php 如果存在就转到 ./install.php 文件，否则就报错 Missing Config File。 第一次进入这个文件的时候，我们肯定是没有安装的，所以我们就进入 install.php 来到 install.php <?php if (!file_exists(dirname(__FILE__) . '/config.inc.php')): ?> 1 检测 install.php 同目录下是否存在 config.inc.php 文件 如果存在就到了第 35 行开始执行下面这段代码 require_once dirname(__FILE__) . '/config.inc.php'; //判断是否已经安装 $db = Typecho_Db::get(); try { $installed = $db->fetchRow($db->select()->from('table.options')->where('name = ?', 'installed')); if (empty($installed) || $installed['value'] == 1) { Typecho_Response::setStatus(404); exit; } } catch (Exception $e) { // do nothing } 12345678910111213 引入 config.inc.php 配置文件，紧接着查询 table.options 表，是否包含 'name = installed 的行，如果没有没有检测到就报错 404，如果存在就继续执行。当然现在的我们是没有安装的，我们执行上面的代码，如果已经安装的流程，我们会在后面分析。现在让我们回到上面的部分看这段代码 <?php /** * Typecho Blog Platform * * @copyright Copyright (c) 2008 Typecho team (http://www.typecho.org) * @license GNU General Public License 2.0 * @version $Id$ */ /** 定义根目录 */ define('__TYPECHO_ROOT_DIR__', dirname(__FILE__)); /** 定义插件目录(相对路径) */ define('__TYPECHO_PLUGIN_DIR__', '/usr/plugins'); /** 定义模板目录(相对路径) */ …