MarkdownParse 插件文章解析修复教程

本文摘要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;
    }

    // ... 后续代码 ...

关键修改点说明

  1. 重写 instance 方法
    在获取单例实例后,立即调用 $instance->initInstance()。这确保了即使是同一个静态实例,在每次被请求使用时,其内部状态也是干净的。
  2. 新增 initInstance 方法
    该方法负责将类的所有关键状态属性(特别是 $rawTocList 数组)重置为默认值。

    $this->rawTocList = []; // 必须清空,否则上一篇文章的目录会累积到当前文章

4. 验证修复

完成修改后,保存文件。尝试访问之前导致崩溃的长文章,或进行 XMLRPC 发布测试,应不再出现超时或内存溢出问题。

觉得内容不错?我要

评论 暂无评论
暂无评论,快来抢沙发吧~