答案是需同时满足三条件:composer config -g repo.packagist输出正确镜像地址、curl -I返回HTTP/2 200、composer update --refresh -v日志中请求URL为镜像域名;任一不成立即未走通。

composer update --refresh 后怎么知道镜像同步真成功了
不是看终端有没有报错,而是确认三件事是否同时成立:composer config -g repo.packagist 输出是你配的镜像地址(如 {"type": "composer", "url": "https://mirrors.aliyun.com/composer/"});curl -I https://mirrors.aliyun.com/composer/packages.json 返回 HTTP/2 200;执行 composer update --refresh -v 时日志里出现的请求 URL 是镜像域名,不是 packagist.org。漏掉任一条件,都说明没走通——微信通知推的只是“命令跑完了”,不是“源真同步好了”。
用 go-wxpush 实现镜像同步完成后的微信推送
go-wxpush 是目前最轻量、免认证、纯测试号就能跑的方案,Docker 镜像仅 2MB,适合嵌入 CI 或定时任务流。关键点在于它不依赖企业微信,只靠微信测试号 + 模板消息,配置项少、失败路径明确。
你需要准备四个值:appid、appsecret、userid、template_id,全部来自 mp.weixin.qq.com/debug/cgi-bin/sandbox 页面。注意:template_id 对应的模板内容必须包含文字前缀(比如“同步完成:{{content.DATA}}”),否则微信客户端不显示正文。
推送命令示例(加在 composer update --refresh 后面):
composer update --refresh && \
curl -X POST http://localhost:8080/send \
-H "Content-Type: application/json" \
-d '{"touser":"oXXXXXX-xxxx","template_id":"TEMPLATE_ID_HERE","data":{"content":{"value":"Composer 镜像元数据刷新完成 ✅"}}}'前提是已用 Docker 启动 go-wxpush 服务:docker run -d -p 8080:8080 -e APPID=xxx -e APPSECRET=xxx -e TEMPLATE_ID=xxx ghcr.io/asundust/go-wxpush。别用公网 IP 直连,本地 curl 走 127.0.0.1 最稳。
为什么不能直接监听 packages.json 文件变动来触发微信通知
因为 Composer 镜像站的元数据更新不是原子写入:常见做法是先生成 packages.json.tmp,再 mv 覆盖,或者用 rsync 的 --inplace 导致文件被截断重写。单纯用 inotifywait -e close_write 容易捕获到中间状态,推送时文件可能还没 flush 到磁盘,curl 请求会返回空或 404。
更可靠的做法是让镜像同步脚本自己发信号:
- 同步完成后执行 touch /path/to/mirror/.synced && sync
- 用 inotifywait -e moved_to /path/to/mirror/.synced 监听该文件
- 触发后立刻调用 go-wxpush 推送,避免竞态
别省掉 sync,Linux 缓存机制会让 touch 看似成功,实则还在 page cache 里,下游服务 curl 可能读不到最新时间戳。
微信通知里该写什么才真正有用
不要只写“同步完成”,要带上下文信息,否则你半夜收到消息还得爬起来查日志。建议至少包含:
- 当前生效镜像地址(composer config -g repo.packagist | jq -r '.url')
- packages.json 的 Last-Modified 响应头(curl -I https://mirrors.aliyun.com/composer/packages.json 2>/dev/null | grep Last-Modified)
- 本次 composer update --refresh 实际拉取的 provider 数量(从 -v 日志里 Downloading ... 行数统计)
这些字段拼在一起发给微信,才能一眼判断是不是真的“新包可用了”,而不是“命令执行完了”。尤其 Last-Modified,它是镜像站真实同步时间的唯一可信依据——比你本地执行时间准得多。



















