HomeRésuméOpen SourceWorkBlog

No PHP 8.6.0RC1

Wednesday, 23 September 2026

Tomorrow, the PHP 8.6 release manager team is planning to announce the first release candidate (RC) of PHP 8.6, PHP 8.6.0RC2. So, what happened to PHP 8.6.0RC1?

Missing RC1 confusion

Automation

The process of tagging new PHP releases is fairly mechanical. The documentation lists the commands to run and what changes need to be made to various files. In an effort to simplify the process for release managers (RMs), there have been repeated attempts over the years to automate some of the steps.

For PHP 8.6, I am serving as the "veteran" RM and mentoring two "rookie" RMs (Matteo Beccati and Joe Ferguson), both of whom have been using a Docker container to automate part of the process of building new releases. To be clear, there is nothing wrong with using such automation, and I'm not trying to call them out for doing something wrong. I had reviewed the code that they were using and also did not spot the issue that arose this week.

Version bump

When the first release candidate for a PHP branch is created (in this case PHP 8.6.0RC1), the release managers also create a new branch for that minor version (here PHP 8.6). At that point, the primary branch in the php/php-src is prepared for developing the next minor version. For example, last year when I was building PHP 8.5.0RC1 I pushed a commit to update the main branch to be targeting PHP 8.6.

One of the steps when creating this new development branch is to update the API numbers in ZEND_EXTENSION_API_NO, ZEND_MODULE_API_NO, and PHP_API_VERSION. We want those numbers in the version branch (e.g. PHP-8.5) to be higher than the previous numbers in the primary branch, and we want the primary branch to have even higher numbers. Thus, we ensure that the PHP 8.5 branch has a newer API version than it had while under development, and that PHP 8.6 development has a newer version than PHP 8.5.

Unfortunately, the script that the release managers are using for automation this year had a bug. It was designed to bump those numbers in the PHP-8.6 branch when creating the PHP-8.6.0 branch (which is part of building the last release candidate) rather than when creating the PHP-8.6 branch as part of building the first release candidate.

Because the API numbers were not bumped at the right time, the code that was tagged as php-8.6.0RC1 had the wrong API numbers. As a result, a new tag needed to be created once the API numbers were properly bumped. The "first" release candidate of PHP 8.6.0 will therefore be numbered 2 instead of 1.

Conclusion

The PHP 8.6 release managers have been great to work with, and have been diligent in their supervision of the automation that they use. Everyone makes mistakes, and they are far from the first to need to skip a planned release number.

My goal here is simply to explain what happened for anyone looking for PHP 8.6.0RC1, not to criticize or cast blame on the release managers for PHP 8.6. Matteo and Joe handled the situation the exact same way that I would have. They built the RC1 tag, realized that the version bump was missing, and decided to tag a new RC2, all without me needing to intervene.

In a field where "first" is frequently translated to "number 0", hopefully translating "first release candidate" to "release candidate number 2" shouldn't be too confusing.