AI 出的网站诊断报告,我逐条验证后才动手——9 条问题 1 条是假的
背景与目标
晚上军师(豆包)丢给我一份 wdmeng.cn 的网站诊断报告 HTML,说它"分析出博客存在的一些 SEO 问题"。我的原话:
"这个是豆包你分析出来我的 ceo 存在的一些问题,再验证一下这些问题是否属实。如果属实的话,给一个修改的方案。"
注意这句指令的两个动作:先验证,再给方案。没有让它直接动手。这一步事后看是整个会话最值钱的决定。
报告列了 9 条问题,P0 级 1 条(完全缺失 Open Graph/Twitter Card)、P1 级 3 条(结构化数据不足、图片无懒加载、Hero 图 1.39MB)、P2 级 5 条(摘要 Markdown 残留、sitemap 缺 lastmod、缺 robots meta 等)。
过程回顾
第一步:验证——线上 curl 不通,就转读本地源码
直接 curl 线上首页,nginx 直接 403(WAF 拦数据中心 IP)。没硬刚,转策略:
- 项目就在本机
D:\code\php\BuildadminAi\buildadmin,ThinkPHP 服务端直出——模板就是最终 HTML,读模板等于读线上输出; - 连本地 MySQL(
buildadmin_geo_local)实查文章数据。
第二步:9 条问题逐条对账
读完全部 9 个前台模板 + 6 个 Service/控制器,数据库实查 34 篇已发布文章后,结果分三类:
✅ 属实(6 条):OG/Twitter Card 零输出;JSON-LD 只有 BlogPosting 一块;所有封面图零懒加载;卡片图零 width/height;sitemap 空板块无 lastmod;无显式 robots meta。
⚠️ 方向属实数字有出入(2 条):默认封面占比——报告说 83%,实查 33/34 = 97%,更严重;Hero 图报告说 1.39MB,本地 hero-figure.png 实测 587KB,偏大没错但数字对不上。
❌ 不属实(1 条):报告说"首页摘要里出现 #、> 等 Markdown 符号"。实查最新 12 篇文章的 summary 字段全是干净纯文本,全库 0 篇含 Markdown 符号。这条是假阳性——但代码层确实有隐患:TextHelper::summaryFallback() 在 summary 为空时只 strip_tags 不剥 Markdown,未来某篇摘要留空就会漏出符号。
第三步:拍板
我把对账结果 + 修改方案(P0/P1/P2 分层、涉及 7 个文件清单)摆上去,问了两个决策点:P0+P1 是否一起做、summary 清洗要不要做。
本人原话:"1+2一起干了"——7 个字,两个决策点全部拍板。这种短句指令对我这种执行岗是最友好的。
第四步:动手,20 个文件
改动面:
TextHelper.php:新增cleanMarkdown()(剥#/>/**/`/[]()/列表/分隔线)+truncateSmart()(句末标点处收刀)SeoMeta.php:新增ogTags()输出完整 OG+Twitter Card meta 串StructuredData.php:新增breadcrumbList()+webSiteOrg()(@graph 合并 WebSite+Organization+SearchAction)- 三个控制器:Article/Index/Category 注入 og_tags 和 JSON-LD
- 10 个模板:全部非首屏
<img>加loading="lazy"+ width/height(按 CSS 里的 aspect-ratio 写死比例值防 CLS) Feed.php:空板块 lastmod 兜底用全站最新文章时间- 4 张图转 WebP:hero 587KB→157KB(-73%)、avatar 406KB→46KB(-89%)
关键踩坑(三个,全是低级错误)
坑 1:大块插入时把方法声明删了
给 StructuredData.php 插两个新方法,old_string 匹配时手快,把 private function iso8601(mixed $timestamp): string 这行一起吃掉了,留下一个裸 {。
发现:php -l 报错 unexpected identifier。解决:立刻 Read 全文件确认现场,Edit 补回声明。
坑 2:注释里的 */ 提前闭合块注释
新写 cleanMarkdown() 的文档注释:
/**
* Markdown 语法清洗:去标题#/引用>/粗体**/行内代码`/链接[]()/分隔线---
*/
粗体**/ 里的 */ 把注释提前关了,后面的中文注释字变成了 PHP 代码,语法爆炸。解决:注释里不写 */ 序列,改成"粗体斜体标记"。
坑 3:把返回数组当对象调方法(线上 500)
照 Article.php 的模式在 Category.php 写:
$seo = (new SeoMeta())->forCategory($category);
$ogTags = $seo->ogTags([...]); // ← $seo 是数组,不是对象
forCategory() 返回 ['title'=>..., 'description'=>...] 数组,我却在它上面调 ogTags()。本地起服务一跑,板块页直接 500。解决:拆成 $seoMetaObj = new SeoMeta(); $seo = $seoMetaObj->forCategory(...); $ogTags = $seoMetaObj->ogTags(...);。
最终验证(自证闭环)
php -l 全部 7 个 PHP 文件 → 0 错误
php think geo:selfcheck → ALL PASS
本地起 8099 实测:
/ 200 og: 全套输出,lazy×15
/a/19 200 BlogPosting + BreadcrumbList(三级)
/c/ai-log 200 og:type=website
/sitemap.xml 200 每行均有 <lastmod>
commit 263d13f2,20 files changed,推到 origin/master。
收口阶段撞车:两个 AI 同时操作服务器
push 完想 SSH 部署,发现:
root@154.217.247.150:Permission denied(publickey)- 老服务器
154.217.247.195:22:连接超时
本人后来说明:Kimi Code 端也在操作同一台服务器,它说"帮你这边的修改一起提交了"。我核对 git log:它的 commit 6ed7d59d 只改了 footer 一行文案,我的 263d13f2 是我自己 push 的——"帮我提交"其实是个误会,两个 commit 各自独立都在 master 上。
紧接着线上探测发现异常:/sitemap.xml 返回 500、新 webp 文件 500、旧 png 文件 404。本地合并 Kimi 的改动后复跑四页全 200——代码没问题,是 Kimi 在服务器上 pull 的中间态。
做得好的地方
- 没照单全收诊断报告:实查数据库推翻"Markdown 残留"假阳性,避免了改不存在的问题;
- 每个改动都实跑自证:php -l → selfcheck → 本地起服务四页实测,不靠"应该没问题";
- 部署边界划清:SSH 不通就明确告诉用户卡点在哪、给确切命令,不假装部署完成。
复盘与改进
- 多 Agent 并发必须有部署收口人:两个 AI 同时改同一个仓库、同时碰同一台服务器,文件系统中间态(webp 500/png 404)就是这么来的。以后任何跨岗位任务,部署动作只允许一个岗做;
- Edit 工具大段插入前,old_string 要肉眼核对完整方法签名——坑 1 纯手快;
- 写 PHP 注释时脑内过一遍
*/序列——坑 2 是语法常识没触发; - 复制相邻代码模式时,先确认返回值类型——坑 3 是"看着像就抄了"。
成长评估(10 分制)
| 维度 | 分 | 证据 |
|---|---|---|
| 指令与提示词质量 | 9 | "再验证一下是否属实"+"1+2一起干了"——两个拍板都精准命中关键分叉 |
| 判断与结论 | 9 | 实查数据库推翻假阳性;线上异常时没甩锅,先本地复跑排除代码问题 |
| 思维方式 | 8 | 先验证再动手、每改必实跑;但坑 1/2/3 全是本可避免的手滑 |
| 最终结果与产出 | 7 | 代码全绿+commit 上远端;线上部署没收口(Kimi 并发所致,非单方失分) |
| AI 协作能力 | 6 | 军师这边三连低级错(删方法声明/注释闭合/数组当对象),全靠 php -l 和实跑抓到 |
最有价值提炼:AI 出的诊断报告=假设清单,不是工单清单。先花 20% 时间验证,再花 80% 时间动手。
改进一条:以后多文件批量改完,先跑一遍 php -l 再跑业务页实测,不要靠 commit 前才发现。
素材点
- 项目:
D:\code\php\BuildadminAi\buildadmin(ThinkPHP 8 + BuildAdmin Go 版前台) - commit:
263d13f2(SEO/GEO 全量优化)、6ed7d59d(footer 文案) - 本地自证脚本:
geo:selfcheck命令、8099 端口临时起服 - 线上 WAF:curl 一律 403,只能靠静态资源探测反推部署状态
