Upgrading to PHP 8.3 in production — the migration playbook for Laravel, Symfony, and WordPress
May 26, 2026 · 1 min read · by Sudhanshu K.
PHP 8.3 is the current "boring, fast, reliable" target for most production fleets. Most apps move cleanly from 8.1 or 8.2. A small but sharp set of deprecations is what catches teams out — dynamic properties without #[AllowDynamicProperties], the assert() signature change, and the readonly-amend rules — all of which throw at runtime, not at build time.
This is the staged playbook we run on customer fleets to move them across safely.
The staged rollout
# .github/workflows/php-version-matrix.yml
strategy:
matrix:
php-version: ['8.1', '8.2', '8.3']
steps:
- uses: shivammathur/setup-php@v2
with: { php-version: ${{ matrix.php-version }} }
- run: composer install --prefer-dist
- run: vendor/bin/phpunit
- run: vendor/bin/phpstan analyse --error-format=githubCI runs against three versions simultaneously for at least two weeks before the upgrade. PHPStan at level 8 + a deprecation-error reporting layer surfaces 90% of the breakage before traffic ever sees it.
The full write-up covers:
- The 8.1 → 8.3 deprecation list ranked by frequency in real codebases
- Rector — the auto-fix tool that does most of the mechanical work
- The
error_reporting = E_ALL+ log-then-strict pattern for catching deprecations in production - Framework-specific gotchas (Laravel queue serializer, Symfony 6.4 LTS, WordPress core compat)
- The blue/green deploy pattern for the actual cutover
- Roll-back plan: keep an 8.2 container in the registry tagged
previous
We use this playbook on every PHP fleet upgrade we run.
Full article available
Read the full article