【问题标题】:PHP HTML Tidy: size limit to bufferPHP HTML Tidy:缓冲区的大小限制
【发布时间】:2013-04-04 16:00:59
【问题描述】:

我正在尝试使用作为 PHP (http://www.php.net/manual/en/book.tidy.php) 一部分的 HTML Tidy 实现来重新格式化大量 HTML。我遇到了一个问题,其中 Tidy 将输出截断超过某个点(大约 8K)。

当我创建一个大约 10K 长的字符串并将其交给 tidy_repair_string 时,如下所示:

$output = tidy_repair_string($output, array( 
    'indent' => true, // enforce indentation 
    'hide-comments' => true, // Remove the comments 
    'wrap' => 100, // Break each line after 100 chars 
    'output-html' => true, // Output as HTML 
    'char-encoding' => $encoding // The input/output encoding 
), $encoding); 

我删除了 8,070 个字符后的所有内容。如果我用 10 个字符填充字符串的开头,那么末尾正好有 10 个字符。
有没有办法更改 tidy_repair_string 的缓冲区大小,使其更大?

看着http://www.php.net/manual/en/tidy.getconfig.php,似乎没有配置选项,Google 非常无用/我的 Google-fu 让我失望了,而且没有大量的文档。任何帮助将不胜感激!

编辑:我在 Windows 7 上使用 xampp-portable-lite-win32-1.8.1-VC9。即使我将 php.ini 更改为使用 memory_limit = 900M,问题仍然存在

【问题讨论】:

  • 可能是存入文件并解析文件,而不是字符串?

标签: php htmltidy


【解决方案1】:

好吧,我能想到这可能失败的几个原因。

  1. 您已经超出了您的内存限制,不仅仅是这个函数调用,而是将变量加载到内存中以及您正在进行的任何预处理。要对此进行测试,您可以尝试将 php.ini 中的内存限制增加到非常高的值,或者您可以使用 memory_get_usage()。 在创建对象之前运行一次,然后在创建对象后再次运行,并获取两个结果之间的差异。 (How to find memory used by an object in PHP? (sizeof))

  2. PHP tidy 在 Linux 的 tidy 程序的一个版本上进行引导。我知道不久前,该程序一次限制为 4096 个字符(http://www.autoitscript.com/forum/topic/129973-tidy-4096-char-limit/),但看起来该错误已得到修复。不过,我建议只是测试该理论的方法是回显您的 10K 字符串(这需要一分钟),然后直接通过 bash 的 tidy 程序运行。我决定自己测试这个理论:

    来自 BASH,echo $(python -c 'print 20000*"a"') > test_file。因为一个 char 是 1 个字节,这个命令应该为我们创建一个 20K 的文件。显然,这不会通过 tidy 验证,但它是一些不错的垃圾文本,我可以扔给程序。现在用tidy < test_file 将它输入到 tidy(如果你在命令行上没有 tidy,sudo apt-get install tidy)。对我来说,这不会失败,但也许试一试。如果它没有失败,那么它不是特定于引导的 bash tidy 程序。

    *现在我们已经消除了 php.ini 和实际的 bash tidy 程序的问题。

  3. 然后我尝试重新创建您的错误。

    我开始使用上面的注释,解析文件而不是字符串。

    <?PHP
    $output = tidy_repair_file("test_file");
    
    print strlen($output);
    ?>
    

    对于 tidy_repair_file strlen,我得到了 20111(其中额外的 111 个字符来自整齐的格式。没有截断。 然后我尝试将其读入活动内存并将其解析为字符串。

    <?PHP
    $data = readfile("test_file"); //read a 20K file into active memeory
    
    $encoding = "ascii"; //I just set my encoding to 'ascii' because I like it...
    
    $output = tidy_repair_string($data, array(
    'indent' => true, // enforce indentation
    'hide-comments' => true, // Remove the comments
    'wrap' => 100, // Break each line after 100 chars
    'output-html' => true, // Output as HTML
    'char-encoding' => $encoding // The input/output encoding
    ), $encoding);
    
    print strlen($output);
    ?>
    

我显然在这里做错了,因为我的垃圾文件回显给我,然后是“132”,这是一个基本的 HTML 文件:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
  <head>
    <title></title>
  </head>
  <body>
    20001
  </body>
</html>

虽然我做错了什么,但此输出确实告诉我我正在解析一个没有截断的 20K 文件。

还值得注意的是,我在提示符中使用php test.php 并通过网络浏览器运行它都尝试了此代码。我得到相同的结果。没有截断。值得一提的是,我透露我是在 Ubuntu Server 而非 Windows IIS 上运行它的。

尝试将您的变量输出到一个文件,然后针对它运行 tidy_repair_file()。显然,这种解决方案是不可持续的,也不会扩展,但它会通知您原始字符串是否存在问题。

另外,请尝试在您的 tidy 调用之前和之后在 $output 上运行 strlen() - 确保您的字符串在 tidy 之前是 10K 字符串...只是作为健全性检查。

祝你好运,我希望这会有所帮助!

【讨论】:

  • 哇!非常感谢您的周到、周到的回复! (我希望我有更多的支持:))。我用来测试问题的代码位于pastebin.com/fum84SpW。第 1 步:我尝试在 php.ini 中使用 memory_limit = 900M 将内存限制更改为 900 MB。它仍在发生。第 2 步:我不确定如何从命令行运行 HTML tidy,以便它使用 php 使用的 php_tidy.dll。第 3 步:您的帖子提醒我,我可能应该指定我正在使用的平台 - Windows 上的 XAMPP。我会去编辑原始帖子以明确这一点。
猜你喜欢
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
  • 2016-12-30
  • 1970-01-01
  • 2017-05-05
相关资源
最近更新 更多