Masterminds / Masterminds/html5-php
Parsing document with a lot of HTML tags is slow
Nobody has claimed this yet.
- Dominant language
- HTML
- Stars
- 1.8k
- Forks
- 122
- PR merge metrics
- No merged PRs in 30d
Description
I have a script that generates a HTML sample that is ~1.5MB in size. It emulates a real-world example. Then I parse it.
$html = '<HTML><BODY>';
$lines = 20000;
while ($lines--) {
$html .= '<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Consolas">>> </FONT></SPAN></P>';
}
$html5 = new Masterminds\HTML5();
$node = $html5->loadHTML($html);
and here's the result:
PHP Fatal error: Maximum execution time of 120 seconds exceeded in vendor/masterminds/html5/src/HTML5/Parser/DOMTreeBuilder.php on line 433
PHP Stack trace:
PHP 1. {main}() test.php:0
PHP 2. Masterminds\HTML5->loadHTML() test.php:23
PHP 3. Masterminds\HTML5->parse() vendor/masterminds/html5/src/HTML5.php:98
PHP 4. Masterminds\HTML5\Parser\Tokenizer->parse() vendor/masterminds/html5/src/HTML5.php:174
PHP 5. Masterminds\HTML5\Parser\Tokenizer->consumeData() vendor/masterminds/html5/src/HTML5/Parser/Tokenizer.php:89
PHP 6. Masterminds\HTML5\Parser\Tokenizer->tagOpen() vendor/masterminds/html5/src/HTML5/Parser/Tokenizer.php:132
PHP 7. Masterminds\HTML5\Parser\Tokenizer->tagName() vendor/masterminds/html5/src/HTML5/Parser/Tokenizer.php:284
PHP 8. Masterminds\HTML5\Parser\DOMTreeBuilder->startTag() vendor/masterminds/html5/src/HTML5/Parser/Tokenizer.php:388
I tested this with 2.7.0 and some older versions with no success. The sample half of that size works, but it takes 27 seconds to finish (so it's not linear).
Cross-ref: https://github.com/roundcube/roundcubemail/issues/7331
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Reproduce the supplied 1.5MB HTML case, then trace the parser path through HTML5.php and Parser/Tokenizer.php, especially consumeData(), tagOpen(), tagName(), and DOMTreeBuilder.php around line 433. Compare runtime as the generated input grows; done means identifying and correcting the non-linear slowdown without changing the parsed result.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- html, php
- Domain
- performance
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100