
CodeIgniter 3.0.3 升级至 3.0.4 完整指南文件替换流程、核心变更与源码解读【免费下载链接】CodeIgniterOpen Source PHP Framework (originally from EllisLab)项目地址: https://gitcode.com/gh_mirrors/co/CodeIgniter本指南对应 CodeIgniter 官方升级文档 upgrade_304.rst面向从 3.0.3或更早 3.0.x升级到 3.0.4 的开发者。你将掌握完整的升级操作步骤下线维护、替换 system/ 目录、备份自定义文件并了解 3.0.4 版本引入的随机数生成改进、数据库驱动新特性以及二十余项 bug 修复的具体内容配合 system/core/Security.php、system/libraries/Encryption.php 等源码佐证理解这些变更背后的实现原理。升级前须知为什么需要下线网站在执行任何升级操作之前官方文档明确要求先将你的网站下线——具体做法是用一个静态的index.php文件替换现有的入口文件。这一步的目的在于升级过程涉及替换框架核心文件如果在升级中途有用户请求进入可能加载到新旧文件混用的状态导致无法预料的错误。用静态页面例如一段包含网站维护中提示的 HTML临时顶替入口可以保证整个升级窗口期内对外服务的一致性升级完成后再恢复正常的index.php。注意这里替换的是位于仓库/项目根目录的入口文件index.php对应仓库根目录下的 index.php它与system/目录是平级的。恢复时请使用你升级前备份的原始入口文件而不是仓库中的版本——因为你的项目可能在入口文件中定制过application或system目录路径等常量。Step 1替换 system/ 目录下的所有文件与目录官方文档给出的升级核心步骤只有一条替换你system/目录下的所有文件和目录。也就是说从 3.0.4 的发布包或本次镜像仓库的 system/ 目录中将全部文件与子目录复制并覆盖到你项目原有的system/目录中。CodeIgniter 3.x 的system/目录是框架的运行时内核包含core/——框架核心类如 Benchmark.php、CodeIgniter.php、Security.php、Common.php 等database/——数据库抽象层与全部驱动mysql、mysqli、pdo、postgre、sqlite3、oci8、sqlsrv 等helpers/与libraries/——内置辅助函数库与类库Email、Session、Cache、Encryption 等language/——内置语言包。由于 3.0.4 修复了大量问题并调整了若干核心类的实现完整替换而不是选择性覆盖是官方推荐的做法可以避免残留旧版本文件带来的兼容问题。自定义文件的备份要点文档中的 note 强调如果你在这些目录中开发过自定义文件请先为它们制作副本。system/目录理论上是框架自留地但实践中很多团队会通过以下方式扩展它在system/core/下新增自定义核心类如MY_Controller.php、MY_Model.php需配合application/core/下的同名扩展类使用在system/libraries/、system/helpers/下加入自定义类库或辅助函数对system/中的某些文件做过本地化修补。这些文件在替换操作中会被覆盖或删除因此升级前务必备份。备份方式通常有两种目录级备份将整个system/目录复制一份例如cp -r system system.bak升级完成后对比差异文件级备份仅将你改动或新增过的文件单独复制到安全位置替换完成后重新放入。从源码结构看CodeIgniter 3.x 的标准扩展路径其实是application/core/、application/libraries/与application/helpers/参见仓库的 application 目录骨架如果自定义内容原本就放在application/下则不在本次替换范围内不受影响。3.0.4 版本核心变更解读升级文档本身极其简洁但理解为什么需要升级同样重要。根据仓库 changelog.rst 的记录Version 3.0.4 发布于 2016 年 1 月 13 日其核心变更可归纳为三个方面。随机数生成全面拥抱 PHP 7 的 random_bytes()3.0.4 最重要的功能性改进集中在加密与安全相关的随机数生成上system/core/Security.php 的get_random_bytes()方法改为在可用时优先使用 PHP 7 新增的random_bytes()函数system/libraries/Encryption.php 的create_key()方法同样优先使用random_bytes()。以Security::get_random_bytes()见 Security.php#L631为例其实现呈现清晰的降级链public function get_random_bytes($length) { if (empty($length) OR ! ctype_digit((string) $length)) { return FALSE; } if (function_exists(random_bytes)) { try { // The cast is required to avoid TypeError return random_bytes((int) $length); } catch (Exception $e) { // If random_bytes() cant do the job, we cant either ... log_message(error, $e-getMessage()); return FALSE; } } // Unfortunately, none of the following PRNGs is guaranteed to exist ... if (defined(MCRYPT_DEV_URANDOM) ($output mcrypt_create_iv($length, MCRYPT_DEV_URANDOM)) ! FALSE) { return $output; } // ... 后续继续降级到 openssl_random_pseudo_bytes() 等方案 }这段代码说明PHP 7 环境下random_bytes()是首选由操作系统 CSPRNG 提供安全性最高失败则记录错误并返回FALSE绝不静默降级PHP 5 环境下才回退到mcrypt_create_iv()、openssl_random_pseudo_bytes()等方案。Encryption::create_key()见 Encryption.php#L337采用了几乎相同的策略仅在使用openssl_random_pseudo_bytes()时额外检查$is_secure标志。需要说明的是random_bytes()是 PHP 7.0 引入的函数若你的运行环境是 PHP 5仓库在 system/core/compat 目录下提供了hash.php、standard.php等兼容层文件它们以function_exists()守卫的方式为旧版 PHP 补齐缺失函数升级后无需额外配置即可正常工作。数据库驱动新特性3.0.4 为两个数据库驱动新增了能力Oracle 12c 的 OFFSET-FETCH 支持oci8与pdo/oci驱动新增对OFFSET ... FETCH ...分页语法的支持Oracle 12c 及以后版本可用其替代旧的ROWNUM分页方式mysqli 驱动新增 SSL 常量支持支持 PHP 5.6.16 引入的MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT常量允许连接 MySQL 时跳过服务器证书验证适用于使用自签名证书的开发/内网环境。这两个变化与 system/database/drivers 目录下对应驱动的实现相关升级后使用上述驱动的项目在分页查询和 SSL 连接方面将获得更完善的行为。二十余项 Bug 修复3.0.4 修复了一批影响面较广的问题按组件分类如下Query Builder 与数据库核心count_all_results()在使用ORDER BY条件时可能失败#4212simple_query()在连接未正确初始化时仍盲目执行查询#4223数据库 Forge 无法正确处理值为字符串的SET、ENUM类型字段#4245version()在mssql驱动下工作异常#4306在oci8/pdo/oci下返回了横幅文本而非纯版本号#4312error()方法对mysqli驱动的连接错误处理无效#4331query()在 PostgreSQL 上执行带RETURNING语句的查询时不返回结果集#4337mysql、mysqli、pdo/mysql驱动在启用stricton时丢弃其他sql_mode标志在 MySQL 5.7 上禁用stricton时未关闭STRICT_TRANS_TABLES#4349。Session 库files驱动读失败时因 PHP 自身 bug 可能产生多条冗余警告#4039PHP 5 下缺少完善的错误处理由 PHP bug 引起redis与memcached驱动在 PHP 7 下 ID 重新生成后状态保持不正确#4362database驱动可能受到用户空间 Query Builder 条件的影响#4374。Email 库Quoted-printable 编码时可能错误使用不安全的 US-ASCII 字符#4244使用 sendmail 时因More than one from person消息而失败#4343。表单与验证set_checkbox()、set_radio()在表单提交后未正确取消默认勾选状态Form Validation 对空请求的验证失败未提供错误反馈#4312。其他组件Config::base_url()回退到$_SERVER[SERVER_ADDR]时 IPv6 地址格式不正确#4217CAPTCHA Helper 生成随机字符串时可能陷入无限循环String Helper 的alternator()无参数调用失败#4283Loader 的model()方法直接实例化了CI_Model或MY_Model类#4350。这些修复覆盖了从数据库查询、会话管理到表单处理的多个高频场景是建议尽快升级的重要原因。升级完成后的验证与后续路线替换完system/目录并恢复入口文件后建议按以下顺序验证恢复静态index.php为原始入口文件确认站点可正常访问重点回归测试 3.0.4 修复涉及的组件数据库分页查询特别是带ORDER BY的count_all_results()、Session 登录态、表单回显set_checkbox/set_radio、邮件发送检查错误日志中是否有新的警告或异常可借助application/config/config.php中的$config[log_threshold]调整日志级别确认数据库驱动的连接配置application/config/database.php无需因驱动行为变化而调整。如果你是从更早的版本升级而来或者希望继续升级到更新版本可以参考版本升级索引 upgrading.rst其中完整列出了从 1.x 到 3.2.x 的逐版本升级指南3.0.4 的下一版本为 upgrade_305.rst完整变更日志 changelog.rst其中 3.0.5 及后续版本继续修复了 Session、Query Builder、Form Helper 等组件的一系列问题官方下载说明 downloads.rst了解各版本发布包的组织方式。小结从 3.0.3 升级到 3.0.4 的操作路径非常清晰下线站点 → 备份自定义文件 → 整体替换system/目录 → 恢复入口文件。虽然官方升级文档只有寥寥数行但 3.0.4 本身是一个安全加固 缺陷修复型版本——它让随机数生成在 PHP 7 下获得 CSPRNG 级保障为 Oracle 12c 和 mysqli SSL 场景补齐了能力并修复了横跨数据库、Session、Email、表单验证等组件的 20 余项缺陷。对于仍运行在 3.0.3 及更早 3.0.x 版本的生产项目这是一次值得尽快执行的升级。【免费下载链接】CodeIgniterOpen Source PHP Framework (originally from EllisLab)项目地址: https://gitcode.com/gh_mirrors/co/CodeIgniter创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考