2013-04-04 122 views
6

我试图使用PHP的一部分的HTML Tidy实现(http://www.php.net/manual/en/book.tidy.php)为了重新格式化一大块HTML。我遇到了一个问题,其中Tidy将输出截断到某个点(大约8K)。PHP HTML Tidy:缓冲区的大小限制

当我创建一个字符串,它是关于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个字符的LOP断一切。如果我用10个字符填充字符串的开头,那么最后只剩10个字符。
有没有办法改变tidy_repair_string的缓冲区大小,使它更大?

看着http://www.php.net/manual/en/tidy.getconfig.php似乎没有配置选项,谷歌是非常无益的/我的谷歌福已经失败了我,并没有大量的文件围绕此。任何帮助将不胜感激!

编辑:我使用XAMPP的可移植精简版 - win32-1.8.1-VC9在Windows 7的问题仍然存在,甚至发生时,我改变php.ini文件使用memory_limit的= 900M

+0

可能保存到文件并解析文件,而不是字符串? – StasGrin 2013-04-05 11:05:53

回答

1

好吧,我可以想出几个原因,为什么这可能会失败。

  1. 您已经超出了内存限制与眼前这个函数调用,但加载变量到内存中,任何预先处理你在干什么。为了测试这一点,你可以尝试将php.ini中的内存限制提高到不可靠的程度,或者你可以使用memory_get_usage()。 在创建对象之前运行一次,然后在创建对象之后再次运行它,并取两个结果之间的差异。 (How to find memory used by an object in PHP? (sizeof)

  2. PHP tidy引导了一个Linux整洁程序的版本。我知道一段时间后,该程序一次只能放入4096个字符(http://www.autoitscript.com/forum/topic/129973-tidy-4096-char-limit/),但看起来好像该错误已被修复。我建议只是为了测试这个理论,而不是回应你的10K字符串(这需要一分钟),然后通过bash的整洁程序直接运行。我决定自己测试这个理论:

    来自BASH,echo $(python -c 'print 20000*"a"') > test_file。由于char是1个字节,所以这个命令应该为我们创建一个20K的文件。很显然,这不会用整洁来验证,但是这是我可以在程序中抛出的一些不错的垃圾文本。现在用tidy < test_file喂它整齐(如果你没有在命令行,sudo apt-get install tidy)整洁。对我而言,这并不会失败,但也可以尝试一下。如果它没有失败,那么它不是特定于引导的bash整洁程序。

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

  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服务器,而不是Windows IIS。

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

此外,尝试在整洁的调用之前和之后在$ output上运行strlen() - 确保您的字符串是一个10K字符串,然后才能整齐地进行整理......就像完整性检查一样。

祝你好运,我希望这有助于一些!

+0

哇!谢谢你的彻底,深思熟虑的答复! (我希望我有更多upvotes :))。 我用来测试问题的代码位于http://pastebin.com/fum84SpW。 步骤#1:我尝试将内存限制更改为900 MB,在php.ini中使用memory_limit = 900M。它仍在发生。 步骤#2:我不知道如何从命令行运行HTML tidy,以便它使用php使用的php_tidy.dll。步骤3:你的帖子提醒我,我可能应该指定我使用的平台 - Windows上的XAMPP。我会去编辑原来的帖子来说清楚。 – MikeTheTall 2013-04-08 19:46:39