2013-04-04 16 views
6

Próbuję użyć implementacji HTML Tidy, która jest częścią PHP (http://www.php.net/manual/en/book.tidy.php) w celu sformatowania dużej części kodu HTML. Mam problem, w którym Tidy obcina dane wyjściowe po określonym punkcie (około 8K).PHP HTML Tidy: limit rozmiaru do bufora

Kiedy utworzyć ciąg, który jest o 10K długo & ręka go tidy_repair_string, tak:

$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); 

I lops off wszystko po 8.070 znaków. Jeśli podkładam początek łańcucha za pomocą, powiedzmy, 10 znaków, wtedy dokładnie 10 znaków jest pozostawionych poza końcem.
Czy istnieje sposób na zmianę rozmiaru bufora dla tidy_repair_string, aby był większy?

Wygląda na to, że nie ma w nim opcji konfiguracji, Google jest wyjątkowo mało pomocny/mój Google-fu mnie zawiódł i nie ma w tym wiele dokumentacji. Każda pomoc będzie bardzo ceniona!

EDIT: Używam XAMPP-portable-lite-win32-1.8.1-VC9 na Windows 7. Problem nadal się zdarzyć nawet przy zmianie php.ini do korzystania memory_limit = 900M

+0

może być zapisany do pliku i plik parsować, a nie ciąg? – StasGrin

Odpowiedz

1

W porządku, mogę wymyślić kilka powodów, dla których może to się nie udać.

  1. Przekroczono limit pamięci nie tylko z tego wywołania funkcji, ale ładuje zmienną do pamięci i każdy pre-przetwarzania robisz. Aby przetestować to, możesz spróbować zwiększyć swój limit pamięci w php.ini na coś bezbożnego wysoko, lub możesz użyć memory_get_usage(). Uruchom go raz przed utworzeniem obiektu, a następnie ponownie po utworzeniu obiektu i wybierz różnicę między tymi dwoma wynikami. (How to find memory used by an object in PHP? (sizeof))

  2. PHP tidy ładuje się w wersji uporządkowanego programu dla Linuksa. Wiem, że jakiś czas temu program wprowadził limit 4096 znaków (http://www.autoitscript.com/forum/topic/129973-tidy-4096-char-limit/), ale wygląda na to, że błąd został naprawiony. To, co poleciłbym, aby przetestować tę teorię, to jednak powtórzyć twój ciąg 10K (zajmie to minutę), a następnie uruchomić go prosto przez czysty program basha. Zdecydowałem się przetestować tę teorię samodzielnie:

    Z BASH, echo $(python -c 'print 20000*"a"') > test_file. Ponieważ znak jest 1 bajtem, to polecenie powinno utworzyć plik dla nas, który ma rozmiar 20K. Oczywiście, nie będzie to sprawdzane z porządkiem, ale jest to miły tekst wiadomości-śmieci, który mogę rzucić w programie. Teraz załaduj go do porządku (jeśli nie masz porządku w linii poleceń, sudo apt-get install tidy) z tidy < test_file. Dla mnie to nie zawodzi, ale może spróbuj. Jeśli nie zawiedzie, to nie jest specyficzne dla programu ładującego bootowanie.

    * Teraz wyeliminowaliśmy php.ini i rzeczywisty program porządkowy bash jako problemy.

  3. Próbowałem odtworzyć Twój błąd.

    Zacząłem używać komentarza z powyższego, parsując plik zamiast łańcucha.

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

    Dla strlen tidy_repair_file, mam 20111 (gdzie dodatkowe 111 znaków pochodzą z formatowaniem schludny. No obcięcia. Potem próbowałem czytać go do aktywnej pamięci i przetwarza je jako ciąg znaków.

    <?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); 
    ?> 
    

ja oczywiście robię coś złego tutaj, bo dostać mój plik śmieci echem z powrotem do mnie, potem „132”, który jest podstawowym plik HTML:

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

a ja "Robię coś złego, to wyjście nie mówi mi, że parsuję plik 20K bez obcięcia.

Warto również zauważyć, że próbowałem ten kod zarówno przy użyciu php test.php z monitu i uruchomieniu go za pomocą przeglądarki internetowej. Otrzymuję takie same wyniki. Bez obcięcia. Warto również zauważyć, że uruchamiam to z Ubuntu Server, a nie z Windows IIS.

Spróbuj wypisać zmienną do pliku, a następnie uruchom komendę tidy_repair_file(). Oczywiście to rozwiązanie nie jest trwałe i nie będzie skalowane, ale poinformuje cię, czy jest to problem z oryginalnym łańcuchem.

Spróbuj także uruchomić strlen() na $ output przed i po twoim uporządkowanym wywołaniu - upewnij się, że twój ciąg znaków jest ciągiem 10K, zanim trafi w porządek ... tak jak sprawdzanie poprawności.

Życzymy powodzenia i mam nadzieję, że to pomoże!

+0

Wow! Dziękuję za dokładną, przemyślaną odpowiedź! (Szkoda, że ​​nie mam więcej przebojów :)). Kod, którego używałem do testowania problemu, znajduje się pod adresem http://pastebin.com/fum84SpW. Krok 1: Próbowałem zmienić limit pamięci na 900 MB, używając memory_limit = 900M w php.ini. Nadal się dzieje. Krok # 2: Nie jestem pewien, jak uruchomić HTML tidy z wiersza poleceń, aby używał php_tidy.dll, którego używa php. Krok 3: Twój wpis przypomniał mi, że prawdopodobnie powinienem określić platformę, której używam - XAMPP w systemie Windows. Pójdę edytować oryginalny post, żeby to wyjaśnić. – MikeTheTall