FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

Remove quadratic value parsing by GrahamCampbell · Pull Request #604 · vlucas/phpdotenv · GitHub

Remove quadratic value parsing - #604

Merged
GrahamCampbell merged 2 commits into
masterfrom
perf/linear-value-parsing
Aug 24, 2026
Merged

Remove quadratic value parsing#604
GrahamCampbell merged 2 commits into
masterfrom
perf/linear-value-parsing

Conversation

GrahamCampbell commented Aug 24, 2026
edited
Loading

Copy link
Copy Markdown
Collaborator

The value parser rebuilt an immutable value object once per lexer token, copying the whole accumulated string and recomputing its length each time, which is quadratic in the length of a value composed of many small tokens, so a single call to the public parse method on an adversarial value takes seconds. This accumulates the characters and variable offsets directly and builds the value once, removing the repeated immutable value and prefix reconstruction and substantially reducing allocations and copying. Parsing a single entry whose 16MB double-quoted value contains an escaped dollar, which forces the chunked lexer path, drops from 12.4s to 75ms on PHP 8.4, and an unquoted value of 80,000 inline variable markers drops from 9.2s to 101ms, with measured scaling exponents of about 1.0 against 1.9 before; the same shapes measure linear on PHP 7.2, 7.4, 8.2 and 8.3, and output is byte-identical over a 211,158-input differential corpus. This is stacked on #603.

GrahamCampbell force-pushed the perf/linear-value-parsing branch from a395ee1 to c780d5a Compare August 24, 2026 01:01
GrahamCampbell force-pushed the fix/putenv-null-byte-safety branch 2 times, most recently from 488f91e to d0a2385 Compare August 24, 2026 10:43
GrahamCampbell force-pushed the perf/linear-value-parsing branch from c780d5a to 3b1071d Compare August 24, 2026 10:43
GrahamCampbell force-pushed the fix/putenv-null-byte-safety branch from d0a2385 to 8fdf977 Compare August 24, 2026 13:22
GrahamCampbell force-pushed the perf/linear-value-parsing branch from 3b1071d to 550299f Compare August 24, 2026 13:23
GrahamCampbell force-pushed the fix/putenv-null-byte-safety branch from 8fdf977 to 979a77d Compare August 24, 2026 17:28
GrahamCampbell force-pushed the perf/linear-value-parsing branch from 550299f to 6d6a505 Compare August 24, 2026 17:28
GrahamCampbell force-pushed the fix/putenv-null-byte-safety branch from 979a77d to 63d1654 Compare August 24, 2026 17:43
GrahamCampbell force-pushed the perf/linear-value-parsing branch from 6d6a505 to 2d0622b Compare August 24, 2026 17:43
GrahamCampbell force-pushed the fix/putenv-null-byte-safety branch from 63d1654 to 6f2f014 Compare August 24, 2026 17:46
GrahamCampbell force-pushed the perf/linear-value-parsing branch from 2d0622b to 25572b7 Compare August 24, 2026 17:46
Base automatically changed from fix/putenv-null-byte-safety to master August 24, 2026 17:47
GrahamCampbell force-pushed the perf/linear-value-parsing branch from 25572b7 to a7907dd Compare August 24, 2026 17:47
GrahamCampbell merged commit dd5b391 into master Aug 24, 2026
42 checks passed
GrahamCampbell deleted the perf/linear-value-parsing branch August 24, 2026 17:49
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant


Back | FazBrowse Home | New Git URL