批量产品同步场景下快速校验远程图片文件是否存在的实现方案
优化方案
1. 替换HTTP校验逻辑降低单次请求开销
你当前使用get_headers()的校验方式默认发起GET请求,每次校验都要完成完整的HTTP握手、响应传输流程,3500次独立请求叠加后耗时极高。可调整为发起HEAD请求校验:
// 全局设置HTTP请求方法为HEAD stream_context_set_default(['http' => ['method' => 'HEAD']]); // 再执行校验逻辑 if (stripos(get_headers(DESTINATION_URL . "{$path}/{$file}")[0], '200 OK') === false) { // 上传逻辑 }
调整后单次请求的响应体积大幅缩小,整体耗时可降低30%以上。
2. 优化FTP全量列表拉取逻辑
递归调用ftp_mlsd()的耗时核心来自上千次FTP命令往返开销,可改用一次性拉取递归目录列表的方式:
- 调用
ftp_raw()执行LIST -R命令,直接获取所有目录和文件的递归列表,自行解析返回内容即可得到全量远程文件路径,千级目录场景下列全表耗时可控制在2分钟以内 - 本地提前生成所有待同步文件的路径数组,用
array_diff()直接计算本地与远程路径的差集,即可得到所有缺失待上传的文件,数组比对耗时仅为毫秒级
3. 新增增量同步机制降低全量校验频率
- 本地维护已同步文件的记录(可存修改时间、MD5哈希值),每次同步前仅校验有变更的本地文件对应的远程资源,正常补传场景无需每次全量校验所有3500张图片
- 若你持有远程服务器的SSH权限,直接使用
rsync工具同步是最优解,工具会自动对比本地与远程文件的大小、修改时间,仅传输差异内容,几千个文件的同步耗时通常不超过10秒
内容的提问来源于stack exchange,提问作者Faye D.
相关产品推荐
相关产品推荐

