news 2026/9/21 18:14:16

CodeIgniter 3.x 官方变更日志深度解读:从 3.2.0 到 1.0 的演进路线与源码印证

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CodeIgniter 3.x 官方变更日志深度解读:从 3.2.0 到 1.0 的演进路线与源码印证

CodeIgniter 3.x 官方变更日志深度解读:从 3.2.0 到 1.0 的演进路线与源码印证

【免费下载链接】CodeIgniterOpen Source PHP Framework (originally from EllisLab)项目地址: https://gitcode.com/gh_mirrors/co/CodeIgniter

导读

本文以官方 changelog.rst(共 3890 行)为骨架,系统梳理 CodeIgniter 3.x 自 3.2.0 至 3.0.0、以及 2.x/1.x 时代的关键变更脉络。你将掌握:3.x 主线版本中哪些配置项被新增、废弃或移除(如$config['log_file']cookie_samesite等)、Session/Cache/Query Builder 等核心组件的演进方向、以及每一条重要变更在 system/ 与 application/config/ 源码中的真实落点,从而在升级、排查与二次开发时拥有完整的版本视野。

一、版本总览:这份 Change Log 记录了什么

这份文档按时间倒序记录了 CodeIgniter 从 3.2.0("Not Released")一路回溯到 Beta 1.0(2006 年 2 月 28 日首发)的完整版本历史,结构统一为「版本号 + 发布日期 + 变更清单(Security / General Changes / Core / Libraries / Database / Helpers 分类)+ Bug fixes」。

值得注意的关键节点包括:

  • 3.2.0:未发布版本,集中清理历史废弃 API,属于一次大规模"减负"。
  • 3.1.13 / 3.1.12(2022-03-03):PHP 8.0/8.1 兼容性与 session 安全修复。
  • 3.1.0(2016-07-26):正式放弃 PHP 5.2.x,全面转向现代 PHP。
  • 3.0.0(2015-03-30):MIT 重新授权、Active Record 更名 Query Builder、Session 库重写,是 3.x 的奠基版本。

二、3.2.0:一次彻底的"历史债务"清理

2.1 运行环境与核心配置的收口

  • 彻底放弃 PHP 5.4.8 以下的一切支持。结合 3.1.0 已放弃 PHP 5.2.x、3.0.0 要求 PHP 5.2.4 的脉络,可以看到 CI 3.x 对最低 PHP 版本的阶梯式抬升。
  • 更新了 Welcome 视图与 HTML 错误模板的新样式,对应 application/views/welcome_message.php 与 application/views/errors/html/ 下的模板。
  • 可配置目录路径现在会自动补全缺失的尾部DIRECTORY_SEPARATOR,避免拼接路径时的双分隔符问题。
  • 公共函数set_status_header()新增 103、207、308、421、451 五个 HTTP 状态码(定义于 system/core/Common.php),对应 IETF 新 RFC 中的 WebDAV、Misdirected Request、Unavailable For Legal Reasons 等场景。

2.2 Core 层变更

  • 新增$config['log_file'],移除$config['log_file_extension']:日志文件现在可显式指定文件名。当前仓库 application/config/config.php 中对应的配置项为$config['log_filename'](注释说明留空则使用默认'log-'.date('Y-m-d').'.php')。
  • 移除$config['rewrite_short_tags'](PHP 5.4+ 下<?=恒可用)、移除废弃的$config['global_xss_filtering']
  • 移除 Router 类废弃方法fetch_directory()/fetch_class()/fetch_method(),改用类属性访问。
  • 移除 Config 库的system_url()方法。
  • URI 库在 CLI 请求下不再应用$config['url_suffix']$config['permitted_uri_chars']——CLI 场景下这两个限制无意义。
  • Loader 的model()现在总是校验加载的类是否继承自CI_Model(system/core/Model.php 定义了该基类)。
  • Output 库_display()默认参数由空字符串改为NULL

2.3 Input 库的收编

  • 移除$config['allow_get_array']$config['standardize_newlines']
  • 移除废弃方法is_cli_request(),统一改用公共函数is_cli()
  • set_cookie()默认过期时间改为 0(浏览器关闭即失效),且传入负值会直接删除 cookie。
  • get_post()/post_get()现在支持嵌套数组键名。

2.4 Libraries 层变更

  • 移除长期废弃的 Encrypt、Cart、Javascript 三个库;Pagination 移除anchor_class选项。
  • Session 库 redis 驱动新增TLS 与 UNIX socket 连接支持。
  • ZIP 库read_dir()现在包含隐藏(点前缀)文件。

Cache 库是本版改动最集中的模块,当前仓库 system/libraries/Cache/ 可直接印证:

  • 新增apcu驱动(Cache_apcu.php),并在 Cache.php 的驱动白名单中登记。
  • memcached 驱动支持 UNIX socket,且忽略未指定 hostname 的配置项。
  • redis 驱动新增database配置(自动选择库)、移除socket_type配置、优化序列化逻辑。
  • 新增get_loaded_driver()方法返回当前实际使用的驱动,见 Cache.php。

Form Validation 库

  • set_rules()在首个参数非数组且$rules参数未用时抛出BadMethodCallException
  • 新增规则valid_mac,对应源码 Form_validation.php:PHP 5.5+ 直接使用filter_var($mac, FILTER_VALIDATE_MAC),低版本则用正则兼容两种 MAC 书写格式(aa:bb:cc:dd:ee:ff/aabb.ccdd.eeff)。
  • 规则列表中包含is_array时可直接对整个数组进行校验;run()新增第二参数返回处理后的数据。

Email 库validate选项默认值改为TRUE;批量发送时send()恒返回TRUE

Image Manipulation 库dynamic_output渲染时支持new_name自定义输出文件名、尽可能支持多字节文件名,并新增WebP 图像支持

2.5 Database 层变更

  • 移除禁用 Query Builder 的选项——它成为数据库层的必备组件。
  • OCI8 驱动移除$curs_id属性及get_cursor()stored_procedure()方法。
  • 移除旧版 'sqlite' 驱动(SQLite 2,PHP 5.4+ 不再附带)。
  • initialize()失败时抛RuntimeException(不再返回错误码);db_connect()强制设置连接字符集。
  • Database Forge:字段默认值支持CURRENT_TIMESTAMP等日期/时间类型;移除add_column()$_after参数。
  • Query Builder(system/database/DB_query_builder.php):
    • 新增having_in()/or_having_in()/not_having_in()/or_not_having_in()四个方法(源码 L793-L829 区域,统一委托内部_wh_in()qb_having)。
    • where_in()系列四个方法第二参数改为强类型array,拒绝非数组输入(源码 L721-L778)。
    • join()第三参数支持NATURAL子句;别名中允许出现点号。

2.6 Helpers 层变更

  • 移除废弃的 Email Helper、Smiley Helper;Date Helper 的standard_date()/nice_date()、Security Helper 的do_hash()、File Helper 的read_file()全部移除,官方给出的替代方案均为 PHP 原生函数。
  • url_title()移除 'dash' / 'underscore' 分隔符选项。
  • Inflector Helper 新增ordinal_format()(生成 1st/2nd/3rd 序数词)。
  • Download Helperforce_download():可重命名已存在文件、更好利用服务器内存、通过 RFC 6266 的filename*属性支持多字节文件名。
  • String Helper:移除trim_slashes()repeater()random_string()的 'unique'/'encrypt' 选项。
  • HTML Helper:移除br()nbs()meta()支持 "charset" 与 "property" 属性;doctype()默认文档类型改为HTML 5
  • Form Helper:移除form_prep()(改用html_escape());form_upload()删除从未使用的第二个参数。
  • CAPTCHA Helper:新增img_alt(默认 'captcha')与img_class选项;支持输出data:image/png;base64数据 URI;恒生成 PNG;废弃$img_path等独立参数的旧用法。

三、3.1.x:安全加固与 PHP 8 兼容的长尾维护期

3.1.x 系列横跨 2016-2022 年,是 CI 3.x 生命周期最长、安全补丁最密集的维护线。

3.1.12 / 3.1.13(2022-03)

  • 修复 PHP 7+ 下session.use_strict_mode未强制生效导致的会话固定(session fixation)漏洞
  • 新增SameSite=StrictCSRF cookie 属性,配套新增$config['cookie_samesite'](见 config.php L390-L401,默认 'Lax')与set_cookie()$samesite参数。
  • Session 库新增$config['sess_samesite']选项(默认 'Lax',见 config.php L373)。
  • 为 PHP 8.1 与旧版本之间的兼容引入 Session 驱动包装类:源码 Session.php 中is_php('8.0') ? 'PHP8SessionWrapper' : 'OldSessionWrapper'的选择逻辑,对应 PHP8SessionWrapper.php 与 OldSessionWrapper.php 两个文件。
  • 大量代码适配 PHP 8.0/8.1;Database 库新增trans_active()方法暴露事务状态;Query Builder 支持FULL [OUTER] JOIN;Database Forge 支持 Oracle 12.1+ 的AUTO_INCREMENT;File Uploading 支持 WebP 类型检测。

3.1.9 – 3.1.11(2018-2019)

  • 3.1.9auto_link()生成链接默认加rel="noopener"防 tab hijacking;修复 session fixation 漏洞(use_strict_mode此前"形同虚设")。
  • 3.1.10:pdo/mysql 驱动支持ssl_verify;Inflector 的is_countable()因与 PHP 7.3 内建函数冲突更名为word_is_countable()
  • 3.1.11CI_Log日志行尾改用PHP_EOL;Session/Cache 的 redis 驱动适配 phpRedis 5;Session files 驱动在sess_save_path不可用时记日志并触发启动失败而非抛异常。

3.1.3 – 3.1.8(2017-2018)

  • 3.1.3:修复 XSS、vars()文件包含、Email 库mail/sendmail模式下的远程代码执行等漏洞;csrf_verify()增加时序侧信道防护;form_open()针对 BREACH 攻击防护。
  • 3.1.4:修复 Apache 下set_status_header()的 header 注入漏洞;mbstring.func_overload启用时的一批字节安全(byte-safety)问题。
  • 3.1.8xss_clean()增加对 JavaScript 标签函数的过滤。

3.1.0(2016-07-26)

  • 修复 odbc 驱动的 SQL 注入;set_realpath()过滤php://包装器输入。
  • 正式放弃 PHP 5.2.x 及 5.3.7 以下版本
  • password_hash()兼容函数优先使用random_bytes()、直接读/dev/urandom
  • Encryption 库优先使用random_bytes();Session 库在回退到 php.ini 的session.save_path时输出 debug 日志。

四、3.0.x:3.x 大版本的奠基与重构

4.1 3.0.0(2015-03-30):从授权到架构的全面升级

  • MIT License 重新授权,终结旧有的专有授权(对应仓库 license.txt)。
  • 最低 PHP 要求 5.2.4(推荐 5.4+);默认数据库驱动改为 mysqli
  • $_SERVER['CI_ENV']可控制ENVIRONMENT常量;新增异常处理器,错误模板移至 application/views/errors/ 并支持$config['error_views_path']配置。
  • Session 库完全重写为自包含驱动模式($config['sess_driver']),提供 files/database/redis/memcached 四种驱动(默认 files),新增sess_save_path、tempdata 临时数据、has_userdata()等方法。
  • Active Record 正式更名 Query Builder,新增get_compiled_select()/get_compiled_insert()/get_compiled_update()/get_compiled_delete()四个"只编译不执行"的方法,以及unbuffered_row()data_seek()等结果集方法。
  • 新增全新的Encryption 库取代不安全的 Encrypt 库;新增 Redis、Wincache 缓存驱动与increment()/decrement()原子操作。
  • 新增composer_autoload配置、cookie_httponly配置、log_file_permissions配置。
  • Routing 支持多级控制器目录、HTTP 动词路由、回调路由、translate_uri_dashes保留路由。
  • 大量 deprecated API 移除:SHA1 库、EXT 常量、$autoload['core']standard_date()等。
  • 该版本还沉淀了一批后来被 3.2.0 沿用至今的 Helper 能力:html_escape()公共函数、url_title()增强、force_download()新增 MIME 开关与 NULL 读取模式、CAPTCHA 的word_length/pool/colors/font_size等选项。

4.2 3.0.1 – 3.0.6(2015-2016)

  • 3.0.1hash_pbkdf2()兼容函数加入 DoS 缓解;mysqli/pdo_mysql 支持 SSL 连接;url_title()支持 Unicode。
  • 3.0.2:修复一批xss_clean()攻击向量;base_url()/site_url()支持协议相对 URL。
  • 3.0.3base_url()为空时回退$_SERVER['SERVER_ADDR']防 Host 头注入;CAPTCHA 使用系统 PRNG。
  • 3.0.4:安全随机数全面拥抱 PHP 7 的random_bytes();oci8 支持 Oracle 12c 的OFFSET-FETCH
  • 3.0.5insert_batch()/update_batch()新增$batch_size参数(默认 100)。
  • 3.0.6:Cache memcached 驱动新增析构函数确保连接关闭;Form Validation 废弃prep_for_form()

五、2.x 与 1.x:历史遗产中的"现代基因"

虽然 3.x 已全面重构,但 2.x/1.x 时代的许多设计至今仍能在此仓库中看到影子:

  • 2.2.0:Session 库以 HMAC 认证替代 MD5 校验和;Encrypt 库移除xor_encode()
  • 2.1.0:新增 CUBRID 与 PDO 数据库驱动;新增 Migration 库(对应 system/libraries/Migration.php);insert_batch()支持 OCI8;SMTP 支持 TLS/SSL。
  • 2.0.0:移除 PHP 4 支持(要求 5.1.6);移除 Scaffolding 与 Plugins;引入 Drivers 特殊库类型(对应 system/libraries/Driver.php);新增 CSRF 防护与 Security 库;Cache 驱动(APC/memcached/file)诞生;application 目录移出 system。
  • 1.7.2 / 1.7.0:引入 Cart 库、新 Form Validation 库;escape_like_str()reconnect()等数据库能力出现;Profiler 支持多数据库连接。
  • 1.3:引入 Models 支持;Active Record 大规模重构(JOIN 等);CI_ 前缀统一规范;get_instance()全局函数诞生。
  • Beta 1.0(2006-02-28):首个公开发布版本。

这些旧版本条目说明:CI 的"现代核心"(Query Builder、Security、Session 驱动化、缓存抽象)并非一蹴而就,而是在 1.x 的 Active Record + Helper 体系上渐进演化而来。

六、升级实战:把 Changelog 变成迁移清单

基于上述变更日志,面向从 2.x 或旧 3.x 升级的开发者,可归纳出四条硬性检查线:

  1. 配置项核对(对照 application/config/config.php):确认log_file/log_filenamecookie_samesitesess_samesitecsrf_regeneration等新项已就位;删除global_xss_filteringrewrite_short_tagslog_file_extension等已移除项。
  2. API 替换is_cli_request()is_cli()$this->router->fetch_class()$this->router->classdo_hash()/read_file()/trim_slashes()等一律改用 PHP 原生函数;表单验证的prep_for_form规则改为html_escape()
  3. 数据库层:确认 Query Builder 无法再被禁用;where_in()第二参数必须是数组;若使用 OCI8 注意stored_procedure()已移除。
  4. 会话与安全:升级到 3.1.12+ 以获得use_strict_mode修复与 SameSite 支持;Session 数据存储不再支持 cookie 方式,确认sess_driver配置。

七、结语:一份可当作"源码索引"的版本地图

changelog.rst 的价值不仅在于追溯历史:文档中每一行变更都对应着 system/ 与 application/config/ 中真实存在的实现。本文通过valid_mac(Form_validation.php)、having_in()系列(DB_query_builder.php)、Session PHP8 包装类(Session.php)、Cache 驱动白名单(Cache.php)等源码锚点,展示了"日志 → 源码"的交叉验证方法。当你在升级 CI 3.x 应用或排查疑难问题时,这份 Change Log 就是你定位行为的权威索引。

【免费下载链接】CodeIgniterOpen Source PHP Framework (originally from EllisLab)项目地址: https://gitcode.com/gh_mirrors/co/CodeIgniter

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/21 18:10:31

Rocky Linux V8.10软件安装

建议先安装向日葵&#xff0c;如果是CentOS&#xff0c;先配置yum源 # 1. 备份原有源文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak# 2. 下载阿里云源配置文件 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/rep…

作者头像 李华
网站建设 2026/9/21 18:01:46

DLSS 版本切换:不更新游戏,把超采样 DLL 换成你要的版本

DLSS 版本切换&#xff1a;不更新游戏&#xff0c;把超采样 DLL 换成你要的版本 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 游戏开着 DLSS 却一直闪屏&#xff0c;想换个版本试试&#xff0c;游戏文件又不敢动&…

作者头像 李华
网站建设 2026/9/21 18:01:23

Java理发预约系统架构设计与高并发实践

1. 理发预约系统技术架构解析这套理发预约系统采用了当前主流的Java技术栈&#xff0c;经过精心设计能够支撑百万级用户并发。作为从业多年的Java开发者&#xff0c;我认为这个架构选择既考虑了技术先进性&#xff0c;又充分照顾了美发行业的实际业务需求。1.1 后端框架选型Spr…

作者头像 李华
网站建设 2026/9/21 17:59:10

Vue中v-if与v-for优先级:从白屏事故到最佳实践

有不少同学问过我同一个问题&#xff1a;v-if和v-for到底能不能一起用&#xff1f;为什么网上有的说能、有的说不能&#xff1f;这个问题的答案非常反直觉——在Vue 2里"能跑"&#xff0c;但性能和语义都埋着雷&#xff1b;在Vue 3里直接报错&#xff0c;根本跑不起来…

作者头像 李华