ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CodeIgniter 3.1.4 升级至 3.1.5 完整指南:操作步骤、变更解析与源码佐证

CodeIgniter 3.1.4 升级至 3.1.5 完整指南:操作步骤、变更解析与源码佐证 CodeIgniter 3.1.4 升级至 3.1.5 完整指南操作步骤、变更解析与源码佐证【免费下载链接】CodeIgniterOpen Source PHP Framework (originally from EllisLab)项目地址: https://gitcode.com/gh_mirrors/co/CodeIgniter本文面向运行 CodeIgniter 3.1.4及更早 3.1.x的应用系统讲解升级到 3.1.5 的标准流程、该版本引入的安全修复与功能变更并对照当前仓库源码逐一验证其实现细节。读完本文你将掌握可复现的升级步骤、可验证的变更清单以及升级前后需要重点回归测试的模块。升级前的准备工作先让站点下线根据 upgrade_315.rst 的官方指引执行升级操作之前第一步永远是让站点下线用一份静态的 index.php 替换应用入口文件避免升级过程中出现中间态代码被执行造成用户访问异常或数据写入错乱。这一做法在 CodeIgniter 的每个版本升级文档中都是强制前置步骤可参见 upgrading.rst 中列出的全部升级笔记以及相邻版本 upgrade_316.rst、upgrade_320.rst 的开头说明。实操上你可以准备一个只输出 Maintenance 提示的静态 HTML 页在升级期间替换掉index.php升级并验证完成后恢复原文件。Step 1替换 system/ 目录下的全部文件升级的核心操作只有一步将仓库或官方发行包中 3.1.5 的system/目录整体覆盖到你的项目。# 假设你的项目根目录为 /path/to/app将新版 system/ 覆盖过去 cp -R /path/to/codeigniter-3.1.5/system/* /path/to/app/system/官方文档特别强调如果这些目录中存在你自行开发或二次修改过的文件请务必先做副本备份。在 CodeIgniter 3.x 中system/下除了框架核心类还有system/core/、system/database/、system/libraries/、system/helpers/、system/language/等会被开发者扩展的子目录例如你自定义过system/core/Input.php或某个 helper覆盖前要先把改动 diff 出来再决定合并策略。需要注意的边界本次升级不需要改动application/目录除非你同时迁移配置因为 3.1.4 → 3.1.5 没有引入必须新增或重命名的配置项。若你从更早的版本如 3.0.x升级则需另读 upgrade_310.rst 等对应版本笔记。3.1.5 版本到底改了什么基于 changelog 与源码的核对upgrade_315.rst本身是精简的升级指引3.1.5 的具体变更内容记录在 changelog.rstVersion 3.1.5一节Release Date: Jun 19, 2017。升级后建议对照以下清单做回归测试。安全修复valid_email 规则的绕过问题3.1.5 最重要的一项修正是Form Validation 库的valid_email规则在启用idn_to_ascii()时可被绕过。查看当前仓库 Form_validation.php 的实现public function valid_email($str) { if (function_exists(idn_to_ascii) preg_match(#\A([^])(.)\z#, $str, $matches)) { $domain defined(INTL_IDNA_VARIANT_UTS46) ? idn_to_ascii($matches[2], 0, INTL_IDNA_VARIANT_UTS46) : idn_to_ascii($matches[2]); if ($domain ! FALSE) { $str $matches[1]..$domain; } } return (bool) filter_var($str, FILTER_VALIDATE_EMAIL); }可以看到修复后的逻辑先通过正则拆出邮箱域名部分再使用idn_to_ascii()若可用将国际化域名IDN如例え.jp转成 ASCII 形式最后才交给filter_var($str, FILTER_VALIDATE_EMAIL)做最终校验。因此如果你的服务器启用了 intl 扩展idn_to_ascii()存在3.1.5 之前的版本可能因未对 IDN 域名做转换而导致非法邮箱通过校验升级后该问题被修复升级后建议对邮箱格式校验相关业务注册、找回密码、订阅表单等做一轮回归确认合法邮箱含国际化域名邮箱仍能通过、非法邮箱仍被拒绝。功能变更form_label() 支持字符串形式 HTML 属性3.1.5 还更新了 Form Helper 的form_label()函数使其接受字符串形式的 HTML 属性。当前实现见 form_helper.phpfunction form_label($label_text , $id , $attributes array()) { $label label; if ($id ! ) { $label . for.$id.; } $label . _attributes_to_string($attributes); return $label..$label_text./label; }_attributes_to_string()是 Form Helper 内部的公共属性拼接函数它同时兼容数组与字符串两种输入。也就是说升级后你既可以这样调用// 数组形式原有写法兼容 echo form_label(用户名, username, array(class form-label)); // 字符串形式3.1.5 新增支持的写法 echo form_label(用户名, username, classform-label);这属于向后兼容的增强正常情况下不会破坏既有代码但若你的应用曾传入不合法的第三参数升级后可留意输出 HTML 是否正常。3.1.5 的 Bug 修复清单根据 changelog.rst3.1.5 还修复了以下问题升级后应针对对应模块做重点回归问题编号涉及模块修复内容#5070Email 库未能正确检测 7-bit 编码#5084XML-RPC 库变量名拼写错误导致报错#5108Inflector Helpersingular()未正确处理 quizzes#5131路由/控制器私有控制器方法触发 PHP 错误而非返回 404回归修复#5150Database Forgemodify_column()在 oci8、pdo/oci 驱动下重命名列时报错#5155Query Buildercount_all_results()对带LIMIT、OFFSET的查询返回错误结果其中 #5131 与 #5155 是业务影响面最广的两项私有方法路由回归直接关系控制器访问控制count_all_results()的计数准确性则影响分页、统计类功能。如果你的应用使用了 Oracleoci8数据库还需要验证modify_column()相关迁移脚本。升级后的验证与回归建议版本号确认升级后可在入口文件或框架核心确认版本。当前仓库 CodeIgniter.php 中CI_VERSION常量为3.2.0-dev即 3.2 开发线3.1.5 正式版的对应常量为3.1.5。也可在应用代码中执行echo CI_VERSION;快速验证。功能回归优先级表单校验尤其valid_email→ 分页与统计count_all_results()→ 邮件发送7-bit 编码检测→ 控制器私有方法 404 行为 → Oracle 相关建表/改表脚本。后续升级路线3.1.5 之后可继续按官方顺序升级至 3.1.6APC 缓存驱动弃用见 upgrade_316.rst、3.1.7 等再进入 3.2.x涉及CI_Model::__construct()移除、数据库连接异常化、Email 校验默认开启、doctype()默认值改为 html5 等十余项不兼容变更详见 upgrade_320.rst。逐版本阅读对应升级笔记是最稳妥的路径完整的升级笔记索引在 upgrading.rst。小结CodeIgniter 3.1.4 → 3.1.5 是一次典型的补丁级升级官方升级文档本身极为精简——离线站点、整体替换system/目录、备份自定义文件即可完成升级但版本背后包含 1 项安全修复valid_email的 IDN 绕过、1 项功能增强form_label()支持字符串属性和 6 项 Bug 修复。升级动作虽小回归测试的覆盖面却应以上述清单为准这样才能在最小改动下获得最完整的安全与稳定性收益。【免费下载链接】CodeIgniterOpen Source PHP Framework (originally from EllisLab)项目地址: https://gitcode.com/gh_mirrors/co/CodeIgniter创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表