本文摘要MarkdownParse 插件文章解析修复教程1. 问题描述在使用 MarkdownParse 插件时,如果遇到文章内容过多或进行批量处理(如 XMLRPC 发布文章、生成 Feed)时,网站可能会出现崩溃、无限加载或 504 Gateway Time-out 错误。原因分析:该插件使用了单例模式(Singleton Pattern),但在多次调用时未正确重置内部状态。导致 rawTocList...
MarkdownParse 插件文章解析修复教程
1. 问题描述
在使用 MarkdownParse 插件时,如果遇到文章内容过多或进行批量处理(如 XMLRPC 发布文章、生成 Feed)时,网站可能会出现崩溃、无限加载或 504 Gateway Time-out 错误。
原因分析:
该插件使用了单例模式(Singleton Pattern),但在多次调用时未正确重置内部状态。导致 rawTocList(目录列表)等属性在处理下一篇文章时保留了上一篇文章的数据,从而引发内存泄漏或逻辑错误。
2. 修复目标文件
- 文件路径:
usr/plugins/MarkdownParse/ParsedownExtension.php - 类名:
ParsedownExtension
3. 修复方案
我们需要修改 ParsedownExtension.php 文件,重写 instance 静态方法,并添加 initInstance 方法以在每次获取实例时重置类属性。
修改后的代码对照
请打开 usr/plugins/MarkdownParse/ParsedownExtension.php,找到类定义的开头部分,确保包含以下代码:
<?php
require_once 'ParsedownExtra.php';
class ParsedownExtension extends ParsedownExtra
{
// ... 原有的属性定义 ...
protected $findTocSyntaxRule = '/^<p>\s*\[TOC\]\s*<\/p>$/m';
protected $originalBlockRuleList = ['$' => '/\${1,2}[^`]*?\${1,2}/m'];
protected $absoluteUrl = '';
private $isMatureTocEnable = false; // for performance
private $rawTocList = []; // temp store
public $isTocEnable = false;
public $isNeedMermaid = false;
public $isNeedLaTex = false;
/**
* Singleton Pattern
* 修复:重写 instance 方法,每次调用时重置状态
*
* @param string $name
*
* @return ParsedownExtension
*/
public static function instance($name = 'default')
{
$instance = parent::instance($name);
// 关键修复:调用初始化方法重置状态
$instance->initInstance();
return $instance;
}
/**
* Initialize the instance
* 修复:添加初始化方法,重置所有状态属性
*
* @return void
*/
public function initInstance()
{
// 如果父类有 initInstance 则调用,否则可注释掉(视父类实现而定)
// 在当前版本中父类似乎支持或通过魔术方法处理,保持原样即可
if (method_exists(parent::class, 'initInstance')) {
parent::initInstance();
}
$this->isMatureTocEnable = false;
$this->rawTocList = []; // 清空目录缓存,防止内存堆积
$this->isTocEnable = false;
$this->isNeedMermaid = false;
$this->isNeedLaTex = false;
}
// ... 后续代码 ...关键修改点说明
- 重写
instance方法:
在获取单例实例后,立即调用$instance->initInstance()。这确保了即使是同一个静态实例,在每次被请求使用时,其内部状态也是干净的。 新增
initInstance方法:
该方法负责将类的所有关键状态属性(特别是$rawTocList数组)重置为默认值。$this->rawTocList = []; // 必须清空,否则上一篇文章的目录会累积到当前文章
4. 验证修复
完成修改后,保存文件。尝试访问之前导致崩溃的长文章,或进行 XMLRPC 发布测试,应不再出现超时或内存溢出问题。
觉得内容不错?我要