2013-04-04 17 views
6

Sto provando a utilizzare l'implementazione HTML Tidy che fa parte di PHP (http://www.php.net/manual/en/book.tidy.php) per riformattare una grande porzione di codice HTML. Sto avendo un problema in cui Tidy sta troncando l'output oltre un certo punto (circa 8K).PHP HTML Tidy: limite dimensioni al buffer

Quando creo una stringa che è circa 10K lungo & mano a tidy_repair_string, in questo modo:

$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 fuori tutto dopo 8.070 caratteri. Se rilievo l'inizio della stringa con, diciamo, 10 caratteri, esattamente 10 caratteri vengono lasciati fuori dalla fine.
C'è un modo per modificare la dimensione del buffer per tidy_repair_string, in modo che sia più grande?

Guardando a http://www.php.net/manual/en/tidy.getconfig.php non sembra esserci un'opzione di configurazione per esso, Google è notevolmente inutile/il mio Google-fu mi ha fallito, e non c'è un sacco di documentazione su questo. Qualsiasi aiuto sarebbe molto apprezzato!

EDIT: sto usando XAMPP-portatile-lite-win32-1.8.1-VC9 su Windows 7. Il problema continua ad accadere anche quando cambio php.ini usare memory_limit = 900M

+0

può essere salvato nel file e analizzare il file, non stringa? – StasGrin

risposta

1

Va bene, posso pensare a un paio di motivi per cui questo potrebbe fallire.

  1. Hai superato il limite di memoria con non solo questa chiamata di funzione, ma il caricamento della variabile in memoria e qualsiasi pre-elaborazione che stai facendo. Per provare questo, potresti provare ad aumentare il limite di memoria in php.ini a qualcosa di non troppo alto, o potresti usare memory_get_usage(). Eseguilo una volta prima di creare l'oggetto, poi di nuovo dopo aver creato l'oggetto, e fare la differenza tra i due risultati. (How to find memory used by an object in PHP? (sizeof))

  2. PHP tidy esegue il bootstrap su una versione del programma ordinato di Linux. So che un po 'di tempo fa il programma aveva un limite di 4096 caratteri messi contemporaneamente (http://www.autoitscript.com/forum/topic/129973-tidy-4096-char-limit/), ma sembra che quell'errore sia stato corretto. Quello che consiglierei solo per testare quella teoria è di echeggiare la tua stringa da 10K (ci vorrà un minuto) e poi eseguirla direttamente attraverso il programma ordinato di bash. Ho deciso personalmente di testare questa teoria:

    da BASH, echo $(python -c 'print 20000*"a"') > test_file. Poiché un char è 1 byte, questo comando dovrebbe creare un file per noi che è 20K. Ovviamente, questo non si convalida con l'ordine, ma è un bel testo spazzatura che posso lanciare al programma. Ora inseritelo in ordine (se non avete ordinato sulla riga di comando, sudo apt-get install tidy) con tidy < test_file. Per me, questo non fallisce, ma forse provarlo. Se non fallisce, non è specifico per il programma di bash bootstrap.

    * Ora abbiamo eliminato php.ini e l'attuale programma di bash come i problemi.

  3. Ho quindi provato a ricreare il tuo errore.

    Ho iniziato utilizzando il commento di sopra, analizzando un file anziché una stringa.

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

    Per la strlen tidy_repair_file, ho avuto 20111 (dove i supplementari 111 personaggi provengono da formattazione ordinato. No troncamento. Poi ho provato a leggerlo nella memoria attiva e analizzare come una stringa.

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

Io, ovviamente, sto facendo qualcosa di sbagliato qui, perché ho il mio file spazzatura eco verso di me, poi '132', che è un file HTML di base:

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

Mentre io Sto facendo qualcosa di sbagliato, questo output mi dice che sto analizzando un file 20K senza troncamento.

Vale anche la pena notare che ho provato questo codice sia utilizzando php test.php dal prompt sia eseguendolo attraverso un browser web. Ottengo gli stessi risultati. Nessun troncamento È anche degno di nota per me rivelare che sto eseguendo questo fuori da Ubuntu Server, non da Windows IIS.

Provare a esportare la variabile in un file e quindi eseguire tidy_repair_file() su di esso. Ovviamente, questa soluzione non è sostenibile e non verrà ridimensionata, ma ti informerà se si tratta o meno di un problema con la stringa originale.

Inoltre, prova a eseguire strlen() su $ output prima e dopo la tua chiamata di ordine - assicurati che la stringa sia una stringa da 10 K prima che tocchi in modo ordinato ... proprio come un controllo di integrità.

Buona fortuna, e spero che questo aiuti!

+0

Wow! Grazie mille per la tua risposta completa e premurosa! (Vorrei avere più upvotes :)). Il codice che ho usato per testare il problema è su http://pastebin.com/fum84SpW. Passo 1: Ho provato a cambiare il limite di memoria a 900 MB, utilizzando memory_limit = 900M in php.ini. Sta ancora succedendo. Passo 2: Non sono sicuro di come eseguire l'ordine HTML dalla riga di comando in modo che utilizzi il php_tidy.dll utilizzato da php. Passo 3: il tuo post mi ha ricordato che probabilmente avrei dovuto specificare la piattaforma che sto usando: XAMPP su Windows. Vado a modificare il post originale per renderlo chiaro. – MikeTheTall