Repository navigation
perf(routing): dispatch frontend routes through a compiled matcher - #28
Merged
Merged
Conversation
RouteLoader built a UrlMatcher per request and tested one regular expression per route. The compiler pass now dumps the CompiledUrlMatcherDumper tables into the container so warm requests use CompiledUrlMatcher. Routes with a condition keep the runtime matcher because their check compiles to a closure.
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
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Finding
Review finding K-P6:
RouteLoader::handle()created aUrlMatcherover theRouteCollectionon every frontend request, matching one regular expression per route. The cost grows linearly with the number of attribute routes.Change
RouteLoader::compileRoutes()builds theCompiledUrlMatcherDumpertables (static prefix tree, merged regular expressions) at container compile time;RouteCompilerPassstores them as the fourthRouteLoaderargument so they are part of the dumped container.handle()usesCompiledUrlMatcherwhen tables exist and falls back to the previousUrlMatcherotherwise.conditionkeep the runtime matcher: their check compiles to a closure that cannot be dumped. An empty route list compiles to nothing.Verification
RouteAttributeTestasserts that the fixture container carries compiled tables and still matches, returns 405 withAllow, and that conditional/empty route lists compile to[].composer csandcomposer static-analysispass in a PHP 8.5.12 container.