Automatically start new fiber for each request on PHP 8.1+ #117
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.
This changeset ensures X automatically starts a new fiber for each request on PHP 8.1+. This means you can now simply use
await()
in your controller code without having to wrap anything in any explicitasync()
calls anymore. This makes building and consuming async APIs easier than ever before.The first commit introduces a simple fiber implementation that works very similar to the
async()
function, but without introducing any external dependencies. The second commit optimizes this approach to only return a promise on demand internally.Using fibers still shows a noticeable performance impact (~20% in my synthetic tests, but I invite more people to run their own benchmarks!), but there are still a number of outstanding optimizations that will improve this in the future. The optimization in the second commit already shows a ~35% performance improvement over using the simple
async()
implementation and there's definitely room for similar improvements in other areas. I've already filed reactphp/async#30 upstream and will file more follow-up PRs once this is merged.The test suite also employs a couple of workarounds that will no longer be needed once reactphp/async#27 is addressed upstream. I've already prepared the required changes (talking 8+ hours of work here!) and will again file the PR once the above PR is merged.
Enjoy! 🚀
Builds on top of #116 and #62