结论:PHP 站点生成 llms.txt 最省事的做法,是写一个 llms.php 脚本从数据库或 CMS 里读出栏目和文章,拼成 Markdown 文本,再用一条 Nginx/Apache 重写规则把 /llms.txt 指向它,外加一层文件缓存即可。整套代码不超过 40 行,改造时间 30 分钟以内。
llms.txt 是什么,跟 sitemap.xml 有什么区别
结论:llms.txt 是 2024 年 9 月由 Answer.AI 的 Jeremy Howard 提出的站点说明文件,放在域名根目录下,用 Markdown 格式告诉大模型「这个站点有什么、哪些页面值得读」;sitemap.xml 是给搜索引擎爬虫的 URL 清单,两者互补,不能互相替代。
它的结构固定为三层:一级标题写站点名,紧跟一段 > 引用块写一句话简介,然后每个 ## 小节下面用 - [标题](绝对URL): 一句话描述 列出条目。配套还有一个可选的 llms-full.txt,把正文全文拼进去,适合文档站、博客这类内容量在几百篇以内的站点。sitemap.xml 只有 URL 没有语义,而 llms.txt 每条都带描述,AI 引擎引用时能直接判断该不该读。
PHP 怎么自动生成 llms.txt
结论:核心是一个读取数据源、拼接 Markdown、输出纯文本的三段式脚本,配合缓存和重写规则上线。
第一步,写 llms.php:
<?php
header('Content-Type: text/plain; charset=utf-8');
$cache = __DIR__ . '/cache/llms.txt';
if (is_file($cache) && time() - filemtime($cache) < 3600) {
readfile($cache); exit; // 命中缓存,TTL 3600 秒
}
$pdo = new PDO('mysql:host=127.0.0.1;dbname=site;charset=utf8mb4', $user, $pass);
$rows = $pdo->query("SELECT title, slug, summary FROM posts
WHERE status='publish' ORDER BY updated_at DESC LIMIT 200")
->fetchAll(PDO::FETCH_ASSOC);
$out = "# 你的站点名\n\n> 一句话说明本站内容与目标读者。\n\n## 文章\n\n";
foreach ($rows as $r) {
$out .= sprintf("- [%s](https://example.com/%s): %s\n",
$r['title'], $r['slug'], mb_substr($r['summary'], 0, 80));
}
file_put_contents($cache, $out, LOCK_EX);
echo $out;
第二步,加重写规则。Nginx:location = /llms.txt { rewrite ^ /llms.php last; };Apache 在 .htaccess 里写 RewriteRule ^llms\.txt$ llms.php [L]。
第三步,访问 https://你的域名/llms.txt 验证,返回 200 且 Content-Type 为 text/plain 即生效。
内容更新后 llms.txt 怎么保持同步
结论:用「发布钩子主动删缓存 + 定时任务兜底重建」双保险,别指望实时查询。
上面代码用的是 3600 秒 TTL 文件缓存,最坏情况下新文章 1 小时内会出现在 llms.txt 里。如果你要求更快,就在文章发布、编辑、下架的逻辑里加一行 @unlink(__DIR__.'/cache/llms.txt');,下一次请求立刻重建。站点文章超过 200 篇时,把 LIMIT 提到 500,或按栏目拆成多个 ## 小节,但主文件体积建议压在 100KB 以内——它本质是索引,全文放进 llms-full.txt。
如果站点是纯静态、没有数据库,改用递归扫描 Markdown 目录也行,关键是生成结果要落到 web 根目录的 llms.txt,由定时任务每天跑一次。
有哪些容易踩的坑
结论:URL 必须是带域名的绝对地址,字符编码必须 UTF-8,并且不要给 llms.txt 加登录或 UA 限制。
第一,链接写成 /post/123 这种相对路径,AI 抓取端无法拼出完整地址,必须写 https://example.com/post/123。第二,输出前确认没有 BOM,否则首行 # 站点名 前会多出乱码,破坏解析。第三,别在 robots.txt 里屏蔽 /llms.txt,也别用 WAF 拦非浏览器 UA——AI 抓取工具恰恰不是常见浏览器标识。第四,摘要字段记得过滤换行符和 []() 等 Markdown 特殊字符,否则链接语法会被破坏。
另外补一句:llms.txt 目前是社区约定,不是 W3C 或 Google 官方标准,主流 AI 引擎对它的支持程度不一,把它当成低成本的补充信号就好,不必为它重构站点架构。
总的来说,PHP 站点自动生成 llms.txt 的路径就三步:一个查询数据库的 PHP 脚本拼出 Markdown、一条重写规则挂到根路径、一个缓存或定时任务保证内容新鲜。先把 llms.txt 跑通,再按需加 llms-full.txt,是最省力的推进顺序。