织梦生成静态页面失败怎么办

在后台点"一键更新网站",结果提示 "DedeTag Engine Create File False" 或干脆卡在某一步没反应,这是织梦最常见的生成失败问题。根因集中在目录权限、模板错误、文章数据异常、PHP 资源限制四类,本文给出排查路径。

一、最经典报错:DedeTag Engine Create File False

这条错误的字面意思是"织梦标签引擎无法创建文件",最常见原因是:

1. 静态输出目录不可写

织梦默认静态目录是 /a,部分版本是 /html。目录或子目录权限不对,无法写入 HTML 文件。

2. 栏目 HTML 保存路径不存在

后台 → 核心 → 栏目管理 → 修改栏目 → 高级选项 → "文件保存目录",如果填了 /news/2024 但目录没创建,就会失败。

3. 文章命名规则错误

栏目"文章命名规则"被改成 {typedir}/{aid}.html 之外的非标准格式,无法拼出文件路径。

4. 模板里有错误的 dede 标签

{dede:arclist typeid='0' row='10'},typeid=0 在某些版本会触发空指针。

二、按报错信息定位

1. 提示 "Create File False" → 目录权限/路径问题

chmod -R 755 /www/wwwroot/域名/a
chown -R www:www /www/wwwroot/域名/a

2. 提示 "DedeTag xxx not found" → 模板标签错误

检查模板里调用的标签是否存在、是否拼写正确、是否漏了结束标签。

3. 提示 "Fatal error: Allowed memory size..." → PHP 内存不足

memory_limit=256M
max_execution_time=0

4. 提示 "Table xxx doesn't exist" → 数据库表损坏或缺失

REPAIR TABLE dede_archives;
REPAIR TABLE dede_addonarticle;

5. 浏览器 504 Gateway Timeout → 生成时间太长

nginx 的 fastcgi_read_timeout 默认 60 秒,超时返回 504。

三、其他典型失败原因

1. 单篇文章有特殊字符

正文里有未转义的 {dede:} 字样、BOM 字符、控制字符,导致模板编译失败。可临时把这篇文档改为"未审核",看其他文章能否生成。

2. 文档 id 跳号、附加表数据缺失

主表有记录但 dede_addonarticle 没对应行,生成时取不到正文,报错。修复:

DELETE FROM dede_archives WHERE id NOT IN (SELECT aid FROM dede_addonarticle);

3. 模板里调用了不存在的自定义函数

模板改过引入了 {dede:php} 调用自定义函数,但函数文件没上传或函数名写错。

4. 安装了非法插件

某些采集/SEO 插件 hook 了生成流程,导致死循环。

调试技巧:打开 /include/dedetag.class.php,在 CreateFile 函数入口加 echo $filename;,能看到具体失败的文件路径。

四、命令行生成(绕过浏览器超时)

大站建议直接 SSH 跑命令行生成,不受 nginx/php-fpm 超时限制:

cd /www/wwwroot/域名
php -d memory_limit=512M -d max_execution_time=0 \
  dede/makehtml_all.php

也可以分栏目生成:

php -d memory_limit=512M dede/makehtml_list.php typeid=10
php -d memory_limit=512M dede/makehtml_archives.php typeid=10 start=0 end=1000

五、注意事项

1. 修改 php.ini 后必须 systemctl restart php-fpm 才生效。

2. nginx 站点配置里 fastcgi_read_timeout 300 也得调大。

3. 生成前清空 /data/cache/,避免使用旧缓存导致部分文章不更新。

4. 大站分批生成时记录起始 ID,下次接着跑,避免重复劳动。

风险提醒:批量生成前先备份 /a 静态目录,万一新模板有 bug,可以快速回滚老 HTML。

织梦生成静态页面失败,原因再复杂也能归到"目录权限、模板语法、数据完整性、PHP 资源"四类。建议站长养成"小批量试生成 → 看报错 → 改对应配置 → 全量生成"的流程,而不是一上来就一键更新全站。大站长期来看把生成改到命令行执行,能彻底告别浏览器超时类失败,是性价比最高的优化动作。