ThinkPHP3.2 加载过程(二)
回顾:
上次介绍了 ThinkPHP 的 Index.PHP入口文件。但只是TP的入口前面的入口(刷boss总是要过好几关才能让你看到 ,不然boss都没面子啊),从Index.PHP最后一行把我们引路到了TP的大门前(ThinkPHP/ThinkPHP.php)
// 引入ThinkPHP入口文件require './ThinkPHP/ThinkPHP.php';
本次目标:
查看TP的大门,同时稍微探索一下大门内部的东西
正文:
先上代码
<span style="color: #008080"> 1</span> <span style="color: #008000">//</span><span style="color: #008000"> 记录开始运行时间</span><span style="color: #008080"> 2</span> <span style="color: #800080">$GLOBALS</span>['_beginTime'] = <span style="color: #008080">microtime</span>(<span style="color: #0000ff">TRUE</span><span style="color: #000000">);</span><span style="color: #008080"> 3</span> <span style="color: #008000">//</span><span style="color: #008000"> 记录内存初始使用</span><span style="color: #008080"> 4</span> <span style="color: #008080">define</span>('MEMORY_LIMIT_ON',<span style="color: #008080">function_exists</span>('memory_get_usage'<span style="color: #000000">));</span><span style="color: #008080"> 5</span> <span style="color: #0000ff">if</span>(MEMORY_LIMIT_ON) <span style="color: #800080">$GLOBALS</span>['_startUseMems'] =<span style="color: #000000"> memory_get_usage();</span><span style="color: #008080"> 6</span> <span style="color: #008080"> 7</span> <span style="color: #008000">//</span><span style="color: #008000"> 版本信息</span><span style="color: #008080"> 8</span> <span style="color: #0000ff">const</span> THINK_VERSION = '3.2.3'<span style="color: #000000">;</span><span style="color: #008080"> 9</span> <span style="color: #008080">10</span> <span style="color: #008000">//</span><span style="color: #008000"> URL 模式定义</span><span style="color: #008080">11</span> <span style="color: #0000ff">const</span> URL_COMMON = 0; <span style="color: #008000">//</span><span style="color: #008000">普通模式</span><span style="color: #008080">12</span> <span style="color: #0000ff">const</span> URL_PATHINFO = 1; <span style="color: #008000">//</span><span style="color: #008000">PATHINFO模式</span><span style="color: #008080">13</span> <span style="color: #0000ff">const</span> URL_REWRITE = 2; <span style="color: #008000">//</span><span style="color: #008000">REWRITE模式</span><span style="color: #008080">14</span> <span style="color: #0000ff">const</span> URL_COMPAT = 3; <span style="color: #008000">//</span><span style="color: #008000"> 兼容模式</span><span style="color: #008080">15</span> <span style="color: #008080">16</span> <span style="color: #008000">// 类文件后缀</span><span style="color: #008080">17</span> <span style="color: #0000ff">const</span> EXT = '.class.php'<span style="color: #000000">; </span><span style="color: #008080">18</span> <span style="color: #008080">19</span> <span style="color: #008000">//</span><span style="color: #008000"> 系统常量定义</span><span style="color: #008080">20</span> <span style="color: #008080">defined</span>('THINK_PATH') or <span style="color: #008080">define</span>('THINK_PATH', __DIR__.'/'<span style="color: #000000">);</span><span style="color: #008080">21</span> <span style="color: #008080">defined</span>('APP_PATH') or <span style="color: #008080">define</span>('APP_PATH', <span style="color: #008080">dirname</span>(<span style="color: #800080">$_SERVER</span>['SCRIPT_FILENAME']).'/'<span style="color: #000000">);</span><span style="color: #008080">22</span> <span style="color: #008080">defined</span>('APP_STATUS') or <span style="color: #008080">define</span>('APP_STATUS', ''); <span style="color: #008000">//</span><span style="color: #008000"> 应用状态 加载对应的配置文件</span><span style="color: #008080">23</span> <span style="color: #008080">defined</span>('APP_DEBUG') or <span style="color: #008080">define</span>('APP_DEBUG', <span style="color: #0000ff">false</span>); <span style="color: #008000">//</span><span style="color: #008000"> 是否调试模式</span><span style="color: #008080">24</span> <span style="color: #008080">25</span> <span style="color: #0000ff">if</span>(<span style="color: #008080">function_exists</span>('saeAutoLoader')){<span style="color: #008000">//</span><span style="color: #008000"> 自动识别SAE环境</span><span style="color: #008080">26</span> <span style="color: #008080">defined</span>('APP_MODE') or <span style="color: #008080">define</span>('APP_MODE', 'sae'<span style="color: #000000">);</span><span style="color: #008080">27</span> <span style="color: #008080">defined</span>('STORAGE_TYPE') or <span style="color: #008080">define</span>('STORAGE_TYPE', 'Sae'<span style="color: #000000">);</span><span style="color: #008080">28</span> }<span style="color: #0000ff">else</span><span style="color: #000000">{</span><span style="color: #008080">29</span> <span style="color: #008080">defined</span>('APP_MODE') or <span style="color: #008080">define</span>('APP_MODE', 'common'); <span style="color: #008000">//</span><span style="color: #008000"> 应用模式 默认为普通模式 </span><span style="color: #008080">30</span> <span style="color: #008080">defined</span>('STORAGE_TYPE') or <span style="color: #008080">define</span>('STORAGE_TYPE', 'File'); <span style="color: #008000">//</span><span style="color: #008000"> 存储类型 默认为File </span><span style="color: #008080">31</span> <span style="color: #000000">}</span><span style="color: #008080">32</span> <span style="color: #008080">33</span> <span style="color: #008080">defined</span>('RUNTIME_PATH') or <span style="color: #008080">define</span>('RUNTIME_PATH', APP_PATH.'Runtime/'); <span style="color: #008000">//</span><span style="color: #008000"> 系统运行时目录</span><span style="color: #008080">34</span> <span style="color: #008080">defined</span>('LIB_PATH') or <span style="color: #008080">define</span>('LIB_PATH', <span style="color: #008080">realpath</span>(THINK_PATH.'Library').'/'); <span style="color: #008000">//</span><span style="color: #008000"> 系统核心类库目录</span><span style="color: #008080">35</span> <span style="color: #008080">defined</span>('CORE_PATH') or <span style="color: #008080">define</span>('CORE_PATH', LIB_PATH.'Think/'); <span style="color: #008000">//</span><span style="color: #008000"> Think类库目录</span><span style="color: #008080">36</span> <span style="color: #008080">defined</span>('BEHAVIOR_PATH')or <span style="color: #008080">define</span>('BEHAVIOR_PATH', LIB_PATH.'Behavior/'); <span style="color: #008000">//</span><span style="color: #008000"> 行为类库目录</span><span style="color: #008080">37</span> <span style="color: #008080">defined</span>('MODE_PATH') or <span style="color: #008080">define</span>('MODE_PATH', THINK_PATH.'Mode/'); <span style="color: #008000">//</span><span style="color: #008000"> 系统应用模式目录</span><span style="color: #008080">38</span> <span style="color: #008080">defined</span>('VENDOR_PATH') or <span style="color: #008080">define</span>('VENDOR_PATH', LIB_PATH.'Vendor/'); <span style="color: #008000">//</span><span style="color: #008000"> 第三方类库目录</span><span style="color: #008080">39</span> <span style="color: #008080">defined</span>('COMMON_PATH') or <span style="color: #008080">define</span>('COMMON_PATH', APP_PATH.'Common/'); <span style="color: #008000">//</span><span style="color: #008000"> 应用公共目录</span><span style="color: #008080">40</span> <span style="color: #008080">defined</span>('CONF_PATH') or <span style="color: #008080">define</span>('CONF_PATH', COMMON_PATH.'Conf/'); <span style="color: #008000">//</span><span style="color: #008000"> 应用配置目录</span><span style="color: #008080">41</span> <span style="color: #008080">defined</span>('LANG_PATH') or <span style="color: #008080">define</span>('LANG_PATH', COMMON_PATH.'Lang/'); <span style="color: #008000">//</span><span style="color: #008000"> 应用语言目录</span><span style="color: #008080">42</span> <span style="color: #008080">defined</span>('HTML_PATH') or <span style="color: #008080">define</span>('HTML_PATH', APP_PATH.'Html/'); <span style="color: #008000">//</span><span style="color: #008000"> 应用静态目录</span><span style="color: #008080">43</span> <span style="color: #008080">defined</span>('LOG_PATH') or <span style="color: #008080">define</span>('LOG_PATH', RUNTIME_PATH.'Logs/'); <span style="color: #008000">//</span><span style="color: #008000"> 应用日志目录</span><span style="color: #008080">44</span> <span style="color: #008080">defined</span>('TEMP_PATH') or <span style="color: #008080">define</span>('TEMP_PATH', RUNTIME_PATH.'Temp/'); <span style="color: #008000">//</span><span style="color: #008000"> 应用缓存目录</span><span style="color: #008080">45</span> <span style="color: #008080">defined</span>('DATA_PATH') or <span style="color: #008080">define</span>('DATA_PATH', RUNTIME_PATH.'Data/'); <span style="color: #008000">//</span><span style="color: #008000"> 应用数据目录</span><span style="color: #008080">46</span> <span style="color: #008080">defined</span>('CACHE_PATH') or <span style="color: #008080">define</span>('CACHE_PATH', RUNTIME_PATH.'Cache/'); <span style="color: #008000">//</span><span style="color: #008000"> 应用模板缓存目录</span><span style="color: #008080">47</span> <span style="color: #008080">defined</span>('CONF_EXT') or <span style="color: #008080">define</span>('CONF_EXT', '.php'); <span style="color: #008000">//</span><span style="color: #008000"> 配置文件后缀</span><span style="color: #008080">48</span> <span style="color: #008080">defined</span>('CONF_PARSE') or <span style="color: #008080">define</span>('CONF_PARSE', ''); <span style="color: #008000">//</span><span style="color: #008000"> 配置文件解析方法</span><span style="color: #008080">49</span> <span style="color: #008080">defined</span>('ADDON_PATH') or <span style="color: #008080">define</span>('ADDON_PATH', APP_PATH.'Addon'<span style="color: #000000">);</span><span style="color: #008080">50</span> <span style="color: #008080">51</span> <span style="color: #008000">//</span><span style="color: #008000"> 系统信息</span><span style="color: #008080">52</span> <span style="color: #0000ff">if</span>(<span style="color: #008080">version_compare</span>(<span style="color: #ff00ff">PHP_VERSION</span>,'5.4.0','<'<span style="color: #000000">)) {</span><span style="color: #008080">53</span> <span style="color: #008080">ini_set</span>('magic_quotes_runtime',0<span style="color: #000000">);</span><span style="color: #008080">54</span> <span style="color: #008080">define</span>('MAGIC_QUOTES_GPC',<span style="color: #008080">get_magic_quotes_gpc</span>()? <span style="color: #0000ff">true</span> : <span style="color: #0000ff">false</span><span style="color: #000000">);</span><span style="color: #008080">55</span> }<span style="color: #0000ff">else</span><span style="color: #000000">{</span><span style="color: #008080">56</span> <span style="color: #008080">define</span>('MAGIC_QUOTES_GPC',<span style="color: #0000ff">false</span><span style="color: #000000">);</span><span style="color: #008080">57</span> <span style="color: #000000">}</span><span style="color: #008080">58</span> <span style="color: #008080">define</span>('IS_CGI',(0 === <span style="color: #008080">strpos</span>(PHP_SAPI,'cgi') || <span style="color: #0000ff">false</span> !== <span style="color: #008080">strpos</span>(PHP_SAPI,'fcgi')) ? 1 : 0<span style="color: #000000"> );</span><span style="color: #008080">59</span> <span style="color: #008080">define</span>('IS_WIN',<span style="color: #008080">strstr</span>(<span style="color: #ff00ff">PHP_OS</span>, 'WIN') ? 1 : 0<span style="color: #000000"> );</span><span style="color: #008080">60</span> <span style="color: #008080">define</span>('IS_CLI',PHP_SAPI=='cli'? 1 : 0<span style="color: #000000">);</span><span style="color: #008080">61</span> <span style="color: #008080">62</span> <span style="color: #0000ff">if</span>(!<span style="color: #000000">IS_CLI) {</span><span style="color: #008080">63</span> <span style="color: #008000">//</span><span style="color: #008000"> 当前文件名</span><span style="color: #008080">64</span> <span style="color: #0000ff">if</span>(!<span style="color: #008080">defined</span>('_PHP_FILE_'<span style="color: #000000">)) {</span><span style="color: #008080">65</span> <span style="color: #0000ff">if</span><span style="color: #000000">(IS_CGI) {</span><span style="color: #008080">66</span> <span style="color: #008000">//</span><span style="color: #008000">CGI/FASTCGI模式下</span><span style="color: #008080">67</span> <span style="color: #800080">$_temp</span> = <span style="color: #008080">explode</span>('.php',<span style="color: #800080">$_SERVER</span>['PHP_SELF'<span style="color: #000000">]);</span><span style="color: #008080">68</span> <span style="color: #008080">define</span>('_PHP_FILE_', <span style="color: #008080">rtrim</span>(<span style="color: #008080">str_replace</span>(<span style="color: #800080">$_SERVER</span>['HTTP_HOST'],'',<span style="color: #800080">$_temp</span>[0].'.php'),'/'<span style="color: #000000">));</span><span style="color: #008080">69</span> }<span style="color: #0000ff">else</span><span style="color: #000000"> {</span><span style="color: #008080">70</span> <span style="color: #008080">define</span>('_PHP_FILE_', <span style="color: #008080">rtrim</span>(<span style="color: #800080">$_SERVER</span>['SCRIPT_NAME'],'/'<span style="color: #000000">));</span><span style="color: #008080">71</span> <span style="color: #000000"> }</span><span style="color: #008080">72</span> <span style="color: #000000"> }</span><span style="color: #008080">73</span> <span style="color: #0000ff">if</span>(!<span style="color: #008080">defined</span>('__ROOT__'<span style="color: #000000">)) {</span><span style="color: #008080">74</span> <span style="color: #800080">$_root</span> = <span style="color: #008080">rtrim</span>(<span style="color: #008080">dirname</span>(_PHP_FILE_),'/'<span style="color: #000000">);</span><span style="color: #008080">75</span> <span style="color: #008080">define</span>('__ROOT__', ((<span style="color: #800080">$_root</span>=='/' || <span style="color: #800080">$_root</span>=='\\')?'':<span style="color: #800080">$_root</span><span style="color: #000000">));</span><span style="color: #008080">76</span> <span style="color: #000000"> }</span><span style="color: #008080">77</span> <span style="color: #000000">}</span><span style="color: #008080">78</span> <span style="color: #008080">79</span> <span style="color: #008000">//</span><span style="color: #008000"> 加载核心Think类</span><span style="color: #008080">80</span> <span style="color: #0000ff">require</span> CORE_PATH.'Think'.<span style="color: #000000">EXT;</span><span style="color: #008080">81</span> <span style="color: #008000">//</span><span style="color: #008000"> 应用初始化 </span><span style="color: #008080">82</span> Think\Think::start();