A Release Manager’s view on how a new PHP version comes together. Discussing the features in PHP 8.5 and how releasing and contributing to a PHP version works.
Showcasing how numerous individuals and the PHP Foundation shape a new PHP version.
self founded company from Germany Fully focused on the PHP ecosystem Great support from them in my RM work Other contributions to PHP Decided to sponsor phpday after my talk was accepted
weeks, more pre-GA Work split between two people Package our php-src branch, getting it ready for people "Tag, build, test, sign, upload, announce" Coordination around the feature freezes What goes in, what is a BC issue, what is a bugfix? Deal with post-RC regressions https://github.com/php/php-src/blob/master/docs/release-process.md
of April 2025 We'll talk about the voting process later showcasing the 8.6 election Alpha 1 on the 3rd of July 2025 3 alphas, 3 betas and 5 RCs before GA 4 planned RCs, some last minute findings 1 skipped Alpha due to a packaging error Plenty of time to test https://scherzer.dev/Blog/20250801-no-alpha-3 https://scherzer.dev/Blog/20251113-release-candidate-5
release for the whole 4.5 years Released on 20 November 2025 2 years of active support 2 more years security PHP 8.5 will be EOL (end of life) on the 1st of January 2030 8.2 is the oldest version with security support https://www.php.net/supported-versions.php
PHP. Individuals do. Most changes are done without an RFC Language maintenance is essential work Karma / Commit-Bit to php-src for maintenance If a PR looks non-trivial, an RFC can be requested Policy updates also follow the RFC process
on the list and help shape them propose RFCs Ideas are cheap, language design is hard Features wouldn't be nearly as good without the list implement them review the code changes vote on RFCs test alphas, betas and RCs and report bugs
an RFC Basically a form to carefully fill out A reference implementation helps, you can find help with that Discuss on the mailing list Voting Technical review on GitHub
8.5 RFCs Each feature lists the authors, implementors and reviewers There are too many people involved in the discussions to list them all, which is great!
Kocsis, Nora Dossche, Tim Düsterhus RFC 3986: Defines URIs WHATWG: Specifies how browsers should treat URLs Web Hypertext Application Technology Working Group A year long story of diligence and collaboration that could be its own talk https://wiki.php.net/rfc/url_parsing_api
& Review: Tim Düsterhus, Volker Dusch, Ilija Tovilo, Arthur Kurbidaev https://wiki.php.net/rfc/closures_in_const_expr final class Locale { #[Validator\Custom(static function ($languageCode) { return \preg_match('/^[a-z][a-z]$/', $languageCode); })] public string $languageCode; } #[DataProviderClosure(static function () { yield 'test data' => ['bar', 'baz']; })] public function testFoo($one, $two) {
Dusch Implementation & Review: Tim Düsterhus, Volker Dusch, Ilija Tovilo, Dmitry Stogov Following the last RFC: https://wiki.php.net/rfc/fcc_in_const_expr final class LogEntry { public string $message; #[Serialize\Custom(self::myMethod(...))] public string $severity; }
Peter Banyard, Arnaud Le Blanc, Tim Düsterhus Trying to make function call chains more readable. https://wiki.php.net/rfc/pipe-operator-v3 $greeting = " Hello World "; $length = $greeting |> trim(...) |> strlen(...); 2 3 4 5 $greeting = " Hello World "; $length = strlen(trim($greeting)); 2 3
Exceptions work by leaving the whole pipe. public function totalCostCalculator(Price $listPrice): Price { return $price |> $this->addShipping(...) |> $this->applyCoupons(...) |> $this->applyMemberDiscounts(...) |> $this->addTax(...) }
33:7. Well over the needed 2/3 majority. Even people who ended up voting against it helped in the discussion to make it the best version of the feature it could possibly be. Despite a lot of eyes, this still received fixes in the RC- phase requiring a post-RFC syntax adjustments. Thanks to Derick finding this while trying to make this work in Xdebug and finding issues.
Jakub Zelenka Remember your CLI and web server settings might be different! ➜ php --ini=diff Non-default INI settings: html_errors: "1" -> "0" implicit_flush: "0" -> "1" max_execution_time: "30" -> "0"
\ -d opcache.opt_debug_level=0x20000 --ini=diff If there is no output, something is missing. # We've been missing: zend_extension=opcache.so # ... except with PHP 8.5 that's solved as well
Tovilo Implementation & Review: Arnaud Le Blanc, Nora Dossche, Dmitry Stogov, Tim Düsterhus Statically built into PHP. Easier "single binary" setups. Simplified production setups. No more "is OPcache available?" checks. https://wiki.php.net/rfc/make_opcache_required
Norris, Nora Dossche, Dmitry Stogov, Gina Peter Banyard, Jakub Zelenka, Calvin Buckley, Bob Weinand, Derick Rethans, Ilija Tovilo, Tim Düsterhus, Remi Collet We already had stack traces for undefined functions, classes and failed requires. Now we have them for: Timeouts Out of Memory errors Class redefinitions https://wiki.php.net/rfc/error_backtraces_v2
Maximum execution time of 1 second exceeded in... // Fatal error: Maximum execution time of 1 second exceeded in... // Stack trace: // #0 .../fatal-error-backtrace.php(4): foo() // #1 .../fatal-error-backtrace.php(11): bar() // #2 .../fatal-error-backtrace.php(11): {closure:/.../fatal-error-backtrace.php:11}() // #3 {main}
Düsterhus, Nora Dossche, Ilija Tovilo, Dmitry Stogov Use return values or explicitly discarded them. https://wiki.php.net/rfc/marking_return_value_as_important function addOneHour(DateTimeInterface $x) { /* Missing return */ $x->modify('+1 hours'); } $x = new DateTimeImmutable('now'); addOneHour($x); // Warning: The return value of method DateTimeImmutable::modify() // should either be used or intentionally ignored by casting // it as (void), as DateTimeImmutable::modify() // does not modify the object itself
as the evaluation is lazy! $response = $this->client->request( 'GET', 'https://api.github.com/repos/symfony/symfony-docs' ); try { // As suggested in the docs, ->getStatusCode() is called early // to block until request finished to handle errors (void) $response->getStatusCode(); } catch (\Exception $e) { // handle transport or HTTP exception } // Actual result handling happens somewhere else handleResult($response);
Norris, Nora Dossche, Gina Peter Banyard, Tim Düsterhus, Máté Kocsis Connection reuse between curl requests across script runs (of the same worker process). https://wiki.php.net/rfc/curl_share_persistence_improvement
Dossche, Tim Düsterhus https://wiki.php.net/rfc/array_first_last // A common, stable way to do this before: foreach ($array as $first) { break; } // Works, but changes the array pointer: $first = reset($array); // Takes up additional memory: $first = array_values($array)[0];
voted in with 35:0. Discussion was short. Just makes sense. If you have an array_first grade improvement: Please build it. Let me know if you need help with the process :)
Volker Dusch, Tim Düsterhus, Nora Dossche, Ilija Tovilo Rounds out the readonly / immutable feature set Makes with-er style APIs much less awkward https://wiki.php.net/rfc/clone_with_v2 return clone($response, [ "statusCode" => 500, "reasonPhrase" => "Error", ]);
Buckley, Tim Düsterhus, Peter Kokot, Jakub Zelenka, Gina Peter Banyard, Christoph M. Becker, Ayesh Karunaratne Where does your PHP come from? Useful for bug reports and debugging. docker run -it --rm php:8.5-cli \ php -r 'echo PHP_BUILD_DATE, PHP_EOL, PHP_BUILD_PROVIDER;' May 8 2026 19:23:57 https://github.com/docker-library/php
Banyard, Christoph M. Becker, Daniel Scherzer, Tim Düsterhus, Theodore Brown, Jorg Sowa, David Carlier, Jakub Zelenka, Nicolas Grekas, Volker Dusch, Calvin Buckley Full insights in UPGRADING: Cleaning up allows new features, future optimizations, and reduces maintenance burden. https://wiki.php.net/rfc/deprecations_php_8_5 https://github.com/php/php-src/blob/PHP- 8.5/UPGRADING
year. Recent releases have had one collection RFC. Great effort by Gina Peter Banyard managing all that. One discussion, lots of votes, keeps things focused, moving and effective. Gina will talk about deprecations tomorrow.
before, helping onboarding people. Pierrick did a fantastic job getting us set up. Timeslots are very plannable. Two rookies/hands-on do the hands-on work, alternating releases.
commitment Everyone who can vote on RFCs can vote here Many folks vote based on how they know and trust Mailing list participation, community involvement, RFCs, open source work, etc. Policies are open, accessible and always evolving through RFCs: https://wiki.php.net/rfc/release_manager_selection_policy
3 March 2026 - call for volunteers 31 March 2026 - vote opens 15 April 2026 - vote is tallied Ongoing RM onboarding organized by the Senior (hands-off) RM and the PHP Infra Team ~2 July 2026 - Alpha 1 ~19 November 2026 - planned GA https://wiki.php.net/todo/php86
work. The hands-off/senior slot ran unopposed. 28 people voted. Single Transferable Vote on the wiki Voters rank candidates in order of preference Lowest get eliminated, votes redistributed Two rookies and one senior get the role
out there builds the binaries you're running. Remi Collet - RHEL and Fedora RPMs Remi does so much more for the project Ondřej Surý - Debian and Ubuntu (deb.sury.org) Christoph M. Becker (cmb) - Windows builds Shivam Mathur - Homebrew & setup-php GHA Communities: docker-library/php maintainers And many more
Build across versions, architectures and SAPIs Maintain hundreds of extensions on top of php-src Find bugs early, often before RC File fixes upstream Look at Remi's name on bug reports and PR reviews.
Les-Tilleuls.coop founder Kévin Dunglas Supported by the PHP Foundation since May 2025 A new single binary runtime for PHP, using Caddy Think Apache with mod_php but with Caddy DX HTTP 103 support, static binaries, worker mode php-fpm continues to be a first class citizen https://frankenphp.dev
Pay developers, accept grants, have a voice in the language community https://thephp.foundation https://thephp.foundation/structure/ https://opencollective.com/phpfoundation
down as ED in early 2026. He stays on the Board, representing JetBrains. Elizabeth Barron took over as ED on the 27th of February 2026. https://thephp.foundation/blog/2026/02/27/welcoming-elizabeth-barron-new-executive- director/
couldn't be happier with whom they picked. A long time member of the PHP community. "Working Together on the Future of PHP": Public calendar to book time with her Direct email contact Asked for goals, motivations, pain points, and stories https://thephp.foundation/blog/2026/03/05/working-together-on-the-future-of-php/
months. Core developers, ecosystem maintainers, user group organizers, OSS foundation leaders. https://thephp.foundation/blog/2026/04/16/integrating-community-feedback-into- foundation-strategy-part1/ Her calendar and the inbox are still open.