0

0

CI框架源码阅读笔记2 一切的入口 index.php,ciindex.php_PHP教程

php中文网

php中文网

发布时间:2016-07-13 10:16:01

|

1196人浏览过

|

来源于php中文网

原创

ci框架源码阅读笔记2 一切的入口 index.php,ciindex.php

  上一节(ci框架源码阅读笔记1 - 环境准备、基本术语和框架流程)中,我们提到了ci框架的基本流程,这里再次贴出流程图,以备参考:


  作为CI框架的入口文件,源码阅读,自然由此开始。在源码阅读的过程中,我们并不会逐行进行解释,而只解释核心的功能和实现。

1.       设置应用程序环境

<span>define</span>('ENVIRONMENT', 'development');

这里的development可以是任何你喜欢的环境名称(比如dev,再如test),相对应的,你要在下面的switch case代码块中,对设定的环境做相关的错误控制,否则,CI框架会认为你没有配置好相应的环境,从而退出进程并给出对应的错误信息:

<span>default</span>:     <span>exit</span>('The application environment is not set correctly.');

为什么一开始就要配置ENVIRONMENT?这是因为,CI框架中很多组件都依赖于ENVIRONMENT的配置,我们看一下system中,引用ENVIRONMENT的地方:


  可以看到,很多组件都依赖于ENVIRONMENT.例如,查看system/config/Common.php, 这其中有一段引入配置文件的代码,是这样实现的:

立即学习PHP免费学习笔记(深入)”;

<span>if</span> ( ! <span>defined</span>('ENVIRONMENT') OR ! <span>file_exists</span>(<span>$file_path</span> = APPPATH.'config/'.ENVIRONMENT.'/config.php'<span>))
{
    </span><span>$file_path</span> = APPPATH.'config/config.php'<span>;
}</span>

  在CI框架中,很多配置文件都是通过这种方式引入的,因此ENVRIONMENT对于CI框架的正确运行时必须的,所以需要在开始的时候配置好ENVIRONMENT。设置ENVIRONMENT的一个好处是:可以很方便的切换系统的配置而不必修改系统代码。例如,在系统进入测试阶段时,database配置为测试的数据库,而在系统测试完毕时,database切换到线上的数据库。这好比是用一个开关控制了系统的环境切换,自然是非常方便的。

2.  配置系统目录和应用程序目录

  CI框架允许你将系统核心源码和应用程序代码分开放置,但是你必须设定好系统的system文件夹和application文件夹(同样,文件夹名字可以是任何合法的文件夹名称,而不一定使用’system’和’application’):

<span>$system_path</span> = 'system'<span>;
</span><span>$application_folder</span> = 'application';

接下来,有这么一段代码:

<span>if</span> (<span>defined</span>('STDIN'<span>))
{
     </span><span>chdir</span>(<span>dirname</span>(<span>__FILE__</span><span>));
}</span>

  这段代码是干嘛的呢?首先,STDINSTDOUTSTDERR是PHP以 CLI(Command Line Interface)模式运行而定义的三个常量,这三个常量类似于Shell的stdin,stdout,stdout,分别是PHP CLI模式下的标准输入标准输出标准错误流。也就是说,这三行代码是为了保证命令行模式下,CI框架可以正常运行。关于PHP CLI的更多细节可以参考:http://www.php-cli.com/

CreateWise AI
CreateWise AI

为播客创作者设计的AI创作工具,AI自动去口癖、提交亮点和生成Show notes、标题等

下载

3.       system目录的正确性验证和application目录验证

(1).       system目录的正确性验证
  Realpath返回的是目录或文件的绝对目录名(没有最后的/)

<span>if</span> (<span>realpath</span>(<span>$system_path</span>) !== <span>FALSE</span><span>)
{
    </span><span>$system_path</span> = <span>realpath</span>(<span>$system_path</span>).'/'<span>;
}
</span><span>$system_path</span> = <span>rtrim</span>(<span>$system_path</span>, '/').'/'<span>;
</span><span>if</span> ( ! <span>is_dir</span>(<span>$system_path</span><span>))
{  
    </span><span>exit</span>("xxxxxxxx"<span>);
}</span>

几个定义的常量(PATH结尾的常量表示目录路径,DIR结尾的变量表示目录名):
a.       SELF(这里指index.php文件)
b.       EXT(deprecated,废弃的,不必关注)
c.       BASEPATH(system文件夹的路径)
d.       FCPATH(前端控制器的路径)
e.       SYSDIR(系统system目录名)
f.        APPPATH(应用程序路径)
查看所有定义的常量的方法:

<span>Print_r</span>(<span>get_defined_constants</span>());

(2)application的目录验证。

代码较简单,不做过多的解释:

<span>if</span> (<span>is_dir</span>(<span>$application_folder</span><span>))
{
    </span><span>define</span>('APPPATH', <span>$application_folder</span>.'/'<span>);
}
</span><span>else</span><span>
{
    </span><span>if</span> ( ! <span>is_dir</span>(BASEPATH.<span>$application_folder</span>.'/'<span>))
    {
        </span><span>exit</span>("Your application folder path does not appear to be set correctly. Please open the following file and correct this: ".<span>SELF);
    }

    </span><span>define</span>('APPPATH', BASEPATH.<span>$application_folder</span>.'/'<span>);
}</span>

  入口文件的最后一行,引入CodeIgniter.php(也是下一步阅读的关键)。CodeIgniter.php被称为bootstrap file,也就是它是一个引导文件,是CI框架执行流程的核心文件。

<span>require_once</span> BASEPATH.'core/CodeIgniter.php';

  总结一下,index.php并没有做太多复杂的工作,而是类似一个后勤,为CI框架的运行提供了一系列配置参数和正确性验证,而这些配置和验证,是CI框架能够正常运行的关键。

  最后,按照惯例,贴一下整个文件的源码(简化注释版):

<span> 1</span> <?<span>php
</span><span> 2</span> 
<span> 3</span> <span>define</span>('ENVIRONMENT', 'development'<span>);
</span><span> 4</span> 
<span> 5</span> <span>if</span> (<span>defined</span>('ENVIRONMENT'<span>))
</span><span> 6</span> <span>{
</span><span> 7</span>     <span>switch</span><span> (ENVIRONMENT)
</span><span> 8</span> <span>    {
</span><span> 9</span>         <span>case</span> 'development':
<span>10</span>             <span>error_reporting</span>(<span>E_ALL</span><span>);
</span><span>11</span>         <span>break</span><span>;
</span><span>12</span>     
<span>13</span>         <span>case</span> 'testing':
<span>14</span>         <span>case</span> 'production':
<span>15</span>             <span>error_reporting</span>(0<span>);
</span><span>16</span>         <span>break</span><span>;
</span><span>17</span> 
<span>18</span>         <span>default</span>:
<span>19</span>             <span>exit</span>('The application environment is not set correctly.'<span>);
</span><span>20</span> <span>    }
</span><span>21</span> <span>}
</span><span>22</span> 
<span>23</span> <span>/*</span>
<span>24</span> <span> * SYSTEM FOLDER NAME
</span><span>25</span>  <span>*/</span>
<span>26</span> <span>$system_path</span> = 'system'<span>;
</span><span>27</span> 
<span>28</span> <span>/*</span>
<span>29</span> <span> * APPLICATION FOLDER NAME
</span><span>30</span>  <span>*/</span>
<span>31</span> <span>$application_folder</span> = 'application'<span>;
</span><span>32</span> 
<span>33</span> <span>/*</span>
<span>34</span> <span> *  Resolve the system path for increased reliability
</span><span>35</span>  <span>*/</span>
<span>36</span> <span>if</span> (<span>defined</span>('STDIN'<span>))
</span><span>37</span> <span>{
</span><span>38</span>     <span>chdir</span>(<span>dirname</span>(<span>__FILE__</span><span>));
</span><span>39</span> <span>}
</span><span>40</span> 
<span>41</span> <span>if</span> (<span>realpath</span>(<span>$system_path</span>) !== <span>FALSE</span><span>)
</span><span>42</span> <span>{
</span><span>43</span>     <span>$system_path</span> = <span>realpath</span>(<span>$system_path</span>).'/'<span>;
</span><span>44</span> <span>}
</span><span>45</span> 
<span>46</span> <span>$system_path</span> = <span>rtrim</span>(<span>$system_path</span>, '/').'/'<span>;
</span><span>47</span> 
<span>48</span> <span>if</span> ( ! <span>is_dir</span>(<span>$system_path</span><span>))
</span><span>49</span> <span>{
</span><span>50</span>     <span>exit</span>("xxxxxxxx"<span>);
</span><span>51</span> <span>}
</span><span>52</span> 
<span>53</span> <span>/*</span>
<span>54</span> <span> *  set the main path constants
</span><span>55</span>  <span>*/</span>
<span>56</span> <span>//</span><span> The name of THIS file</span>
<span>57</span> <span>define</span>('SELF', <span>pathinfo</span>(<span>__FILE__</span>,<span> PATHINFO_BASENAME));
</span><span>58</span> 
<span>59</span> <span>//</span><span> this global constant is deprecataaed.</span>
<span>60</span> <span>define</span>('EXT', '.php'<span>);
</span><span>61</span> 
<span>62</span> <span>//</span><span> Path to the system folder</span>
<span>63</span> <span>define</span>('BASEPATH', <span>str_replace</span>("\", "/", <span>$system_path</span><span>));
</span><span>64</span> 
<span>65</span> <span>//</span><span> Path to the front controller (this file)</span>
<span>66</span> <span>define</span>('FCPATH', <span>str_replace</span>(SELF, '', <span>__FILE__</span><span>));
</span><span>67</span> 
<span>68</span> <span>//</span><span> Name of the "system folder"</span>
<span>69</span> <span>define</span>('SYSDIR', <span>trim</span>(<span>strrchr</span>(<span>trim</span>(BASEPATH, '/'), '/'), '/'<span>));
</span><span>70</span> 
<span>71</span> <span>//</span><span> The path to the "application" folder</span>
<span>72</span> <span>if</span> (<span>is_dir</span>(<span>$application_folder</span><span>))
</span><span>73</span> <span>{
</span><span>74</span>     <span>define</span>('APPPATH', <span>$application_folder</span>.'/'<span>);
</span><span>75</span> <span>}
</span><span>76</span> <span>else</span>
<span>77</span> <span>{
</span><span>78</span>     <span>if</span> ( ! <span>is_dir</span>(BASEPATH.<span>$application_folder</span>.'/'<span>))
</span><span>79</span> <span>    {
</span><span>80</span>         <span>exit</span>("Your application folder path does not appear to be set correctly. Please open the following file and correct this: ".<span>SELF);
</span><span>81</span> <span>    }
</span><span>82</span> 
<span>83</span>     <span>define</span>('APPPATH', BASEPATH.<span>$application_folder</span>.'/'<span>);
</span><span>84</span> <span>}
</span><span>85</span> 
<span>86</span> <span>require_once</span> BASEPATH.'core/CodeIgniter.php';

 

php的ci框架CodeIgniter目录的规划问题

阁下需要在使用框架,那么就要把项目里的第一个程序都放在框架架构之中,而不能在根目录下新建一个admin.php。
阁下应该知晓,CI框架的入口文件是index.php,里面的任何页面都应该基于这个入口文件,即访问路径永远是index.php/*****这样的形式,而不能单独出来一个admin.php,这样的话,没有通过入口文件访问了,那么框架的效用也就没有了。
所以,阁下应该在application里的controllers目录下建一个admin.php,并按CI框架控制器的规则来使用它,这样,访问路径就是index.php/admin这样了

当然,阁下会以为所有的URL中都有一个index.php非常难看,那么阁下可以通过CI框架的路由规则将之隐藏掉,也可以使用服务器的伪静态功能来隐藏掉。但也仅是隐藏了而已,实际路径仍然有index.php这个入口文件。
 

CI框架怎删除地址栏的 indexphp

1.修改Http.conf的LoadModule rewrite_module modules/mod_rewrite.so去掉注释 2.ci根目录增加.htaccess文件 RewriteEngine On RewriteBase /ci #Removes access to the system folder by users. #Additionally this will allow you to create a System.php controller, #previously this would not have been possible. #'system' can be replaced if you have renamed your system folder. RewriteCond %{REQUEST_URI} ^system.* RewriteRule ^(.*)$ /index.php?/$1 [L] #When your application folder isn't in the system folder #This snippet prevents user access to the application folder #Submitted by: Fabdrol #Rename 'application' to your applications folder name. RewriteCond %{REQUEST_URI} ^application.* RewriteRule ^(.*)$ /index.php?/$1 [L] #Checks to see if the user is attempting to access a valid file, #such as an image or css document, if this isn't true it sends the #request to index.php RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?/$1 [L] # If we don't have mod_rewrite installed, all 404's # can be sent to index.php, and everything works as normal. # Submitted by: ElliotHaughin ErrorDocument 404 /index.php .htaccess文件内容
 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/900269.htmlTechArticleCI框架源码阅读笔记2 一切的入口 index.php,ciindex.php 上一节(CI框架源码阅读笔记1 - 环境准备、基本术语和框架流程)中,我们提到了CI框架...

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

46

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

178

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

51

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

92

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

102

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

227

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

532

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

171

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Django 教程
Django 教程

共28课时 | 5万人学习

React 教程
React 教程

共58课时 | 6.1万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号