PHP生成sitemap.xml的核心逻辑是用DOMDocument创建符合Sitemaps协议的XML文档:强制使用DateTime::ATOM格式化时间、htmlspecialchars($url, ENT_XML1)转义URL、设置正确xmlns和UTF-8编码、formatOutput美化输出、save()直接写入绝对路径文件。

Webman 本身不内置 Sitemap 生成功能,但你可以用标准 PHP 方式写一个独立脚本,集成进 Webman 项目里跑定时任务。关键不是“Webman 特有方法”,而是避免踩 XML 格式、输出控制、路径拼接这三类坑。
PHP 脚本必须放在 Webman 项目里可执行的位置
Webman 的定时任务(crontab 或 webman/crontab 插件)只能调用可直接运行的 PHP 文件。不能把生成逻辑塞进 HTTP 控制器里靠访问触发——那会暴露敏感数据,且无权限写文件。
- 推荐路径:
app/Console/SitemapGenerator.php(与app/Console/Commands同级,纯命令行脚本) - 脚本开头加
#!/usr/bin/env php,并设可执行权限:chmod +x app/Console/SitemapGenerator.php - 别用
include或require加载 Webman 的容器或配置——它不是为 CLI 环境设计的;改用原生 PDO 或file_get_contents('config/database.php')手动读配置 - 输出目标路径要写绝对路径,比如
/var/www/html/sitemap.xml,而不是相对路径sitemap.xml—— Webman 的工作目录不等于 webroot
用 DOMDocument 写 sitemap.xml 才不会被 Google 拒绝
字符串拼接 "<loc>$url</loc>" 看似快,但只要 $url 里带 &、、空格或中文,XML 就非法。Google Search Console 会报 “Invalid XML” 或 “Parse error”。<code>DOMDocument 是唯一稳妥选择。
- 必须声明命名空间:
$urlset->setAttribute('xmlns', 'http://www.sitemaps.org/schemas/sitemap/0.9'); -
<loc></loc>值必须用htmlspecialchars($full_url, ENT_XML1)处理,不能只用ENT_QUOTES -
<lastmod></lastmod>必须是 ISO 8601 格式,用(new DateTime($row['updated_at']))->format(DateTime::ATOM),别用date('Y-m-d') - 生成完调
$dom->save('/var/www/html/sitemap.xml'),不要file_put_contents(..., $dom->saveXML())—— 后者可能多出 BOM 或换行导致解析失败
Webman 定时任务里调用 Sitemap 脚本的正确写法
Webman 的 webman/crontab 插件注册任务时,命令字段不能写成 php app/Console/SitemapGenerator.php —— 因为插件默认在 app/ 目录下执行,而你的脚本可能依赖上层路径里的配置或 vendor。
立即学习“PHP免费学习笔记(深入)”;
- 用绝对路径调用:
/usr/bin/php /var/www/html/app/Console/SitemapGenerator.php - 确保
php命令指向你实际使用的 PHP 版本(比如/usr/bin/php8.2),尤其当系统有多个 PHP 时 - 日志重定向很重要:在 crontab 行末尾加
> /var/www/html/runtime/logs/sitemap.log 2>&1,否则失败无声无息 - 别设太高频,比如每分钟一次——数据库查询+XML生成有开销;普通内容站每小时一次足够,新闻站可设为每 15 分钟
robots.txt 和 sitemap.xml 的 URL 必须完全一致
Webman 默认不接管根目录的静态文件,所以你要手动把 sitemap.xml 放到 Webman 的 public 目录(即 webroot)下,并确认 https://yoursite.com/sitemap.xml 可直接 curl 访问。同时 robots.txt 里的声明必须一字不差:
-
Sitemap: https://yoursite.com/sitemap.xml(注意大小写、冒号后一个空格、结尾无斜杠) - 别写成
http://,哪怕你没开 HTTPS —— 现代爬虫会拒收 - 别漏协议,写
Sitemap: /sitemap.xml是无效的,Google 不认相对路径 - 用
curl -I https://yoursite.com/robots.txt确认返回状态码是 200,Content-Type 是text/plain
最易忽略的是文件编码和 BOM:哪怕脚本本身没问题,只要 sitemap.xml 文件被编辑器保存成 UTF-8 with BOM,Google 就会卡在第一行解析失败。生成后务必用 file -i sitemap.xml 检查编码,或用 head -n1 sitemap.xml | hexdump -C 看有没有 EF BB BF 字节。



















