2013-04-04 126 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