CodeIgniter本身不实现数据同步,仅支持读写分离、数据库迁移、备份上传等;同步需由MySQL复制或运维脚本完成。

CodeIgniter 本身不实现数据同步,它只负责把你的 SQL 发到指定数据库——同步是 MySQL 层或运维脚本的事。你看到的“同步”需求,90% 实际是读写分离、多库切换、备份上传或结构迁移,不是框架能代劳的。下面直说怎么做、为什么这么配、哪里容易出错。
database.php 里配两套连接但没用?因为你没在模型里切库
CI 3.x 的 db['default'] 和 db['write'] 只是配置项,不会自动按 SQL 类型路由。$this->db->update() 默认仍走 db['default'](即从库),除非你手动加载写库。
- 写操作必须显式调用:
$this->load->database('write', TRUE),第二个参数TRUE表示返回 DB 对象,不覆盖$this->db - 更稳妥的做法是在 Model 构造函数中预存两个句柄:
$this->db_read = $this->load->database('default', TRUE)和$this->db_write = $this->load->database('write', TRUE) - 从库若开启
read_only=ON,未切库的INSERT会直接报错MySQL Error #1290: The MySQL server is running with the --read-only option -
autoinit => FALSE必须设上,否则每次请求都尝试连从库,延迟高或宕机时整个页面卡死
想让本地和远程数据库结构一致?用 CI4 的 migration,别手写 SQL
CI4 内置的 php spark migrate 是唯一靠谱的跨环境结构同步方式。CI3 没原生支持,硬补容易漏索引或约束。
- 所有表结构变更必须写进
app/Database/Migrations/下的类,用up()/down()方法定义 - 执行
php spark migrate会自动记录版本到migrations表,下次只跑新增的 migration - 团队协作时,migration 文件必须提交 Git,且命名含时间戳(如
20260501000000_add_users_table.php),避免顺序冲突 - 不要在 migration 里写
INSERT初始化数据——那是seeder的事;混在一起会导致重跑失败
$this->dbutil->backup() 返回字符串,不是文件,更不上传 FTP
很多人以为调了 $this->dbutil->backup() 就等于“自动备份”,结果发现服务器上啥都没生成。因为它只返回一个 SQL 字符串,后续步骤全得自己补。
- 必须用
write_file()落盘:write_file('./backups/' . $filename, $backup_content) - FTP 上传要自己调
ftp_connect()+ftp_put(),CI 没封装 FTP 类 - 上传前务必检查连接:
if (@ftp_login($conn, $user, $pass) === false),否则静默失败 - 路径注意方向:FTP 远程路径用正斜杠
/backups/,Windows 本地路径用反斜杠也要转成/ - 别打包整个
application/目录——config/database.php和logs/一起传上去等于送密钥
Session 存数据库就能“同步”?前提是所有实例共用同一张表
把 Session 存进数据库只是第一步。$config['sess_driver'] = 'database' 只让单个应用写进表,多个站点要共享 Session,必须确保它们连的是同一个 ci_sessions 表,且 sess_cookie_name 和 cookie domain 配置一致。
- 表结构必须严格匹配官方定义,尤其是
id字段长度为varchar(40),否则 Token 截断导致登录失效 -
$config['sess_match_ip'] = FALSE得关掉,否则用户换网络(比如从 WiFi 切 4G)就登出 - 如果用负载均衡,后端所有 PHP 实例的
session.save_path必须指向同一数据库连接,不能各自连自己的库 - 别忘了定期清理:
DELETE FROM ci_sessions WHERE timestamp ,不然表越涨越大
真正难的不是配几行代码,而是确认“同步”的边界在哪:是结构?是数据?是会话状态?还是主从延迟容忍度?搞不清这点,再漂亮的配置也只是空中楼阁。


















