CodeIgniter Beta 1.0 到 Beta 1.1 升级指南:五步完成目录重构与配置修正
【免费下载链接】CodeIgniterOpen Source PHP Framework (originally from EllisLab)项目地址: https://gitcode.com/gh_mirrors/co/CodeIgniter
导读
本文以 CodeIgniter 官方升级文档 user_guide_src/source/installation/upgrade_b11.rst 为主体,完整还原从 Beta 1.0 升级到 Beta 1.1 的五个标准步骤:替换入口文件、迁移 config 目录、替换核心目录、添加日历语言文件与修正 config 配置。Beta 1.1 是 CodeIgniter 发展史上一次重要的结构分水岭——它首次允许"多应用共享同一套后端文件",并引入应用级 config 目录与可配置的 URI 协议。读者读完本文,将能掌握这套升级流程的每个细节,并理解这些历史变更在现代版本源码中的落地形态。
一、升级背景:Beta 1.1 引入的关键能力
在 Beta 1.0 时代,CodeIgniter 的配置目录位于 system 目录之下,应用与框架后端文件紧密耦合。Beta 1.1 引入了两项影响深远的架构调整:
- 多应用共享后端:一个 CodeIgniter 安装可以承载多套 "application",它们共同复用同一组框架后端文件,每套应用拥有独立的配置与业务代码;
- 应用级 config 目录:为实现"每套应用拥有自己的配置值",config 目录必须从 system 目录迁入 application 目录。
从当前仓库的目录结构可以清楚看到这两项设计的最终形态:application/config 下集中存放config.php、database.php、routes.php等全部应用配置,而 system 目录则纯粹承载框架核心(core、database、helpers、libraries、language 等),两者边界清晰。
升级共分五个步骤,下文逐一展开。
二、Step 1:替换入口文件(index.php)
操作:用新版index.php替换应用根目录下的旧文件。如果你重命名过 "system" 文件夹,必须在替换后的新文件中同步修改对应的路径信息。
入口文件是 CodeIgniter 的唯一前端控制器(front controller),它负责定义环境、解析路径常量并加载引导文件。在当前仓库的 index.php 中,与"系统目录重命名"直接相关的配置项是:
$system_path = 'system'; $application_folder = 'application'; $view_folder = '';$system_path:system 目录名。若重命名(例如改为ci_system),需在此同步修改;$application_folder:application 目录名,也支持改成绝对路径;$view_folder:若想将 views 目录移出 application,可在此指定,留空则默认位于 application 内部。
替换后,入口文件会通过realpath()解析上述路径,依次定义BASEPATH、FCPATH、SYSDIR、APPPATH、VIEWPATH等路径常量,最后require_once BASEPATH.'core/CodeIgniter.php'拉起整个框架(见 index.php)。若路径配置错误,入口文件会直接返回HTTP 503 Service Unavailable并提示修正。
三、Step 2:迁移 config 目录到 application 之下
操作:将原位于 system 目录下的config目录整体移动到application/config之下。
这是 Beta 1.1 "多应用共享后端文件"架构的前提:每个 application 需要持有自己的配置,因此配置目录必须与应用代码同级、随应用迁移。当前仓库的 application/config 目录即是这一演进的直接产物,其中包含:
| 配置文件 | 作用 |
|---|---|
config.php | 框架全局配置(URI 协议、Cookie、Session、语言等) |
database.php | 数据库连接组配置 |
routes.php | 路由规则 |
autoload.php | 自动加载的类库、辅助函数、配置项 |
constants.php、hooks.php、mimes.php、user_agents.php等 | 常量、钩子、MIME 类型、浏览器标识等专项配置 |
迁移完成后再结合 Step 1 的入口文件,APPPATH即指向application/,框架的 Config、Loader 等核心组件会从APPPATH.'config/'读取配置(仓库中 system/core/Config.php 的加载逻辑即以此为路径基础)。
四、Step 3:替换核心目录
操作:用新版替换以下目录:
drivershelpersinitlibrariesscaffolding
在 Beta 1.1 时代,这些目录位于 system 之下,负责数据库驱动、辅助函数、初始化逻辑、核心库与脚手架功能。对照当前仓库的 system 目录结构,可以看到这些职责的现代形态:
- drivers→ 演变为 system/database/drivers,按数据库细分(
cubrid/、ibase/、mysql/、mysqli/、oci8/、odbc/、pdo/、postgre/、sqlite3/、sqlsrv/等),每个驱动目录内含_driver.php、_forge.php、_result.php、_utility.php四个文件族; - helpers→ system/helpers,包含
array_helper.php、form_helper.php、url_helper.php、text_helper.php等 20 余个辅助函数文件; - libraries→ system/libraries,包含
Calendar.php、Email.php、Form_validation.php、Pagination.php、Session/、Cache/等核心类库; - init / scaffolding→ 从当前仓库结构看,这两个目录在现代版本中已不存在,其职责被引导流程(system/core/CodeIgniter.php)与 Loader/路由机制取代。
替换时务必保持目录名与文件命名规范不变,否则框架按约定加载类库、辅助函数时会出现找不到文件的错误。
五、Step 4:添加日历语言文件
操作:Beta 1.1 新增了与日历类(Calendaring class)对应的语言文件,需要将其加入应用的语言目录:language/english/calendar_lang.php。
该语言文件在仓库中的对应实现是 system/language/english/calendar_lang.php,它定义了三组以cal_为前缀的键:
- 星期缩写:
cal_su~cal_sa(Su、Mo、Tu……); - 星期全称:
cal_sunday~cal_saturday(Sunday、Monday……); - 月份缩写与全称:
cal_jan~cal_dec(Jan、Feb……)与cal_january~cal_december(January、February……)。
日历类在渲染时正是通过CI_Lang读取这些键:月份名称使用$this->CI->lang->line($month_names[$month]),星期名称使用$this->CI->lang->line('cal_'.$day_names[$i]),并都在取不到翻译时回退到英文原文(见 system/libraries/Calendar.php)。因此,若该语言文件缺失,日历组件将无法按本地化语言显示星期与月份。
六、Step 5:修正并扩充 config 文件
这是本次升级中最关键的代码级修正,包含两个子任务。
6.1 修复 Cookie 配置的数组名拼写错误
原application/config/config.php中 Cookie 相关配置存在拼写错误——数组名误写为$conf:
$conf['cookie_prefix'] = ""; $conf['cookie_domain'] = ""; $conf['cookie_path'] = "/";必须更正为$config:
$config['cookie_prefix'] = ""; $config['cookie_domain'] = ""; $config['cookie_path'] = "/";在 PHP 中,$conf与$config是两个互不相干的变量;CodeIgniter 的 Config 类只读取$config数组,若变量名错误,Cookie 相关配置将全部失效。对照当前仓库 application/config/config.php,这一修正后的形态为:
$config['cookie_prefix'] = ''; $config['cookie_domain'] = ''; $config['cookie_path'] = '/'; $config['cookie_secure'] = FALSE; $config['cookie_httponly'] = FALSE; $config['cookie_samesite'] = 'Lax';现代版本还额外补充了cookie_secure(仅 HTTPS 下发送)、cookie_httponly(禁止 JS 读取)与cookie_samesite(SameSite 属性,取值Lax/Strict/None)三个安全项。
6.2 新增 uri_protocol 配置项
最后,向 config 文件追加全新的uri_protocol配置项,用于决定框架从哪个服务器全局变量解析 URI 字符串:
/* |------------------------------------------------ | URI PROTOCOL |------------------------------------------------ | | This item determines which server global | should be used to retrieve the URI string. The | default setting of "auto" works for most servers. | If your links do not seem to work, try one of | the other delicious flavors: | | 'auto' Default - auto detects | 'path_info' Uses the PATH_INFO | 'query_string' Uses the QUERY_STRING */ $config['uri_protocol'] = "auto";Beta 1.1 提供了三种取值:auto(自动探测,默认)、path_info(使用$_SERVER['PATH_INFO'])、query_string(使用$_SERVER['QUERY_STRING'])。auto会依次尝试各服务器全局变量,直到成功解析出 URI。
当前仓库中该配置的现代版本位于 application/config/config.php,取值集已演化为:
| 取值 | 含义 | 说明 |
|---|---|---|
REQUEST_URI | 使用$_SERVER['REQUEST_URI'] | 当前默认值,适用于绝大多数服务器 |
QUERY_STRING | 使用$_SERVER['QUERY_STRING'] | 适用于依赖查询字符串传递 URI 的环境 |
PATH_INFO | 使用$_SERVER['PATH_INFO'] | 注意:使用此协议时 URI 总是会被 URL 解码 |
源码级支撑:URI 解析的真正逻辑在 system/core/URI.php 的构造函数中。CI_URI读取uri_protocol配置后执行分支:
AUTO(仅为向后兼容保留)与REQUEST_URI→ 调用_parse_request_uri()解析;QUERY_STRING→ 调用_parse_query_string();PATH_INFO及其他取值 → 直接读取$_SERVER[$protocol],缺失时回退到_parse_request_uri()。
_parse_request_uri()内部还会借助parse_url()剥离查询串、修正QUERY_STRING与$_GET,并兼容 Nginx 等要求 URI 出现在查询字符串中的服务器(见 system/core/URI.php)。这也解释了文档中"如果链接似乎不工作,试试其他取值"的排查思路:当伪静态重写或服务器配置导致REQUEST_URI无法正确反映路径时,切换到PATH_INFO或QUERY_STRING往往即可修复。
七、升级完成后的验证要点
完成以上五个步骤后,建议按如下顺序验证升级是否成功:
- 访问站点首页:确认入口文件正常引导,无
503 Service Unavailable; - 检查配置加载:确认
application/config/config.php中的$config数组名修正生效——可临时在配置中加入一个自定键,再通过$this->config->item('key')读取验证; - 测试路由与链接:若 URL 形如
index.php/controller/method无法正常解析,尝试切换uri_protocol为PATH_INFO或QUERY_STRING; - 验证日历类:调用
$this->load->library('calendar')生成日历,确认星期与月份文字正常显示(依赖 Step 4 的语言文件); - 确认多应用结构:应用配置与应用代码已彻底与 system 后端分离,可在入口文件 index.php 中通过修改
$application_folder指向不同应用目录来验证"多应用共享后端"能力。
八、结语:一次升级,两项架构基石
Beta 1.0 → Beta 1.1 的五步升级,表面上是文件替换与配置修正,实质上奠定了 CodeIgniter 后续版本的应用/框架分离架构(application与system双层结构)和可配置 URI 协议两大基石。前者让多应用共享一套框架成为可能,后者为框架在不同服务器环境下的 URL 兼容性提供了开关。在现代版本中,这两个设计分别以 application/config 目录的独立性与 system/core/URI.php 的多协议解析机制延续至今——理解这段升级史,有助于更透彻地把握 CodeIgniter 的目录约定与配置原理。
【免费下载链接】CodeIgniterOpen Source PHP Framework (originally from EllisLab)项目地址: https://gitcode.com/gh_mirrors/co/CodeIgniter
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考