最可行路径是增量拉取+时间戳判断+幂等写入:通过updated_at字段识别变更,用PDO参数化查询获取增量数据,结合INSERT...ON DUPLICATE KEY UPDATE实现幂等写入,并以事务包裹批量操作确保一致性。

直接用 PHP 脚本做后台数据同步,最可行的路径是「增量拉取 + 时间戳判断 + 幂等写入」。不依赖数据库复制或消息队列,适合中小项目、测试环境或临时补救场景。
怎么用 updated_at 字段做增量同步
这是最轻量、最容易上手的方式,前提是源表有可靠更新时间字段(updated_at 或 modified_time),且每次 UPDATE/INSERT 都会自动刷新它。
- 确保目标表结构和源表一致,主键必须存在(否则
ON DUPLICATE KEY UPDATE无法生效) - 同步脚本里记录上次成功同步的时间点(比如存进一个本地
last_sync.txt文件,或写进一张小配置表) - 查询时用参数化防止 SQL 注入:
$stmt->execute([$lastTime]),别拼字符串 - 写入用
INSERT ... ON DUPLICATE KEY UPDATE,避免重复插入报错,也省去先查再判的开销
PDO::beginTransaction() 为什么不能少
批量同步时,几十上百条记录如果中途失败,没事务包裹会导致部分写入、部分丢失,数据就对不上了。
- 在循环写入前调用
$target->beginTransaction() - 全部执行成功后
$target->commit();任一失败就$target->rollback() - 注意:MySQL 的 autocommit 默认开启,不显式 begin 就不是事务
- 别在事务里做耗时操作(如远程 API 调用、sleep),容易锁表或超时
cron 定时跑脚本要注意什么
用系统 cron 跑 PHP 同步脚本很常见,但几个坑踩过才懂:
立即学习“PHP免费学习笔记(深入)”;
- 脚本里所有路径写绝对路径,
require '/var/www/sync/config.php',别用相对路径 - PHP CLI 版本可能和 Web 不同(比如没开
pdo_mysql扩展),运行前先php -m | grep pdo确认 - 输出日志重定向到文件,例如
* * * * * /usr/bin/php /var/www/sync/pull.php >> /var/log/sync.log 2>&1 - 加个简单锁文件(如
/tmp/sync.lock),防止上一次还没跑完,下一次又触发
真正难的不是写通逻辑,而是时间戳字段被业务代码漏更新、跨时区导致 updated_at 比服务器时间早、或者某次网络抖动让脚本中断却没 rollback —— 这些细节不盯住,同步就会慢慢漂移。



















