PHP Migration & End-of-Life Modernization

ModernLift · ·8 min read

PHP 7.4 reached end of life on November 28, 2022 and PHP 8.1 followed on December 31, 2025 — neither receives security fixes anymore, so every CVE disclosed since is unpatched on them. Migrating a PHP application off an unsupported version means moving the code and its dependencies onto a supported release, dealing with the breaking changes between major versions along the way, ideally slice by slice with each proven equivalent before cutover.

A PHP application is rarely just PHP. It’s a specific framework version, a composer.json full of dependencies pinned to a runtime, a set of extensions the host was configured for, and years of code written against behavior that newer PHP no longer honors. That’s why “upgrade PHP” is never a flag flip — and why an application on an unsupported version is a problem you can’t apt upgrade your way out of.

How much runway your PHP version has left

The PHP project retires each branch on a published schedule, and several versions still in production are past the end of it:

VersionEnd of lifeStatus
PHP 7.4November 28, 2022End of life — no fixes
PHP 8.0November 26, 2023End of life — no fixes
PHP 8.1December 31, 2025End of life — no fixes
PHP 8.2December 31, 2026Security-only
PHP 8.3December 31, 2027Supported
PHP 8.4December 31, 2028Supported

Dates are from the PHP release schedule. Since March 2024 each branch gets roughly two years of active support and two of security-only fixes, ending on the last day of the calendar year. The line that matters is the same for each retired version: once a branch reaches end of life, no security fix will ever ship again for a vulnerability found the next day — and PHP’s are not hypothetical, with actively exploited CVEs disclosed against versions long past support. An application on PHP 7.x or 8.0 is not “old but fine” — it’s running on a runtime the project has stopped defending.

What end of life actually means for a PHP app

The runtime raises the stakes over an ordinary dependency, for three reasons.

  • It’s almost always internet-facing. PHP overwhelmingly runs web applications, which means an unpatched interpreter sits directly in the path of untrusted traffic — exactly where an unfixable vulnerability does the most damage.
  • It collides with compliance. PCI DSS, SOC 2, and HIPAA all expect systems in scope to be patchable. An unsupported PHP in a regulated request path is a finding waiting to be written, and “we run a WAF” rarely satisfies an assessor on its own.
  • It drags the whole stack. The framework, the libraries, and often the extensions are pinned to the PHP version. Staying on an old runtime freezes everything above it, so the technical debt compounds across the entire application.

The migration options

There is no single right move; there’s a right move for your application, and it turns on how far behind it is and what it’s pinned to.

  • Step up to the next supported version where the gap is small. Moving from PHP 8.0 to 8.2 or 8.3 is the cheapest path when the framework and dependencies have compatible releases and the breaking changes are few. Often the honest answer for a well-maintained codebase.
  • Upgrade the stack in lockstep. When the application is on a framework version that itself has aged out, the PHP move and the framework move have to happen together — more involved, because the breaking changes stack, but unavoidable.
  • Re-platform the parts that fight the move. Where code leans on removed functions, deprecated extensions, or patterns PHP 8 rejects, those slices need real re-implementation rather than a mechanical bump. The bulk of the genuine work lives here.

The decision is rarely about the interpreter — it’s about the framework and dependencies the code is pinned to, and the behavior changes between major versions. That coupling is what turns a version bump into a modernization project.

Modernizing off it, slice by slice

We treat the application the same way we treat any legacy system: not a single risky cutover, but a sequence of small, reversible steps.

A strangler facade lets the legacy PHP application and the modernized path run side by side. We break the application into slices — a route group, a service, a bounded module — and before any slice carries live traffic, we prove it behaves identically to the legacy: same responses, same state, reconciled against the original. AI-accelerated discovery reads the code, the composer dependencies, and the extension assumptions end to end and captures what the application actually does — including the undocumented logic the original authors never wrote down — under senior-engineer review. Traffic shifts only on green, rollback stays a flag away, and the unsupported PHP path is retired only once nothing depends on it.

When a straightforward step-up is enough

Not every PHP upgrade is a modernization project, and we’ll say so. An application only a version or two behind, on a maintained framework with compatible dependencies, is often best served by a straightforward step up to a supported PHP release — the lowest-cost path that clears the end-of-life risk, and one many teams can do themselves. The slice-by-slice approach earns its place when the gap is wide, when the framework has aged out alongside the runtime, when the code leans on behavior PHP 8 removed, or when the application can’t take downtime. Matching the effort to the actual gap is part of the assessment, not an afterthought.

Where to start

The first step is small and bounded: understand the application before committing to a path. A discovery call scopes which PHP version is in play, how far the framework and dependencies have drifted, where the compliance exposure sits, and whether the right move is a step-up or a deeper migration — on evidence, not a sales pitch. Reach the team at sales@modernlift.ai.

Frequently asked questions

When did PHP 7.4 reach end of life?
PHP 7.4 reached end of life on November 28, 2022, and PHP 8.0 ended on November 26, 2023 (the PHP release schedule). PHP 8.1 reached end of life on December 31, 2025. Any application still on PHP 7.x or 8.0 runs a version that no longer receives security fixes, with every vulnerability disclosed since unpatched.
Which PHP versions are still supported?
Under the current PHP release schedule each branch gets roughly two years of active support and two of security-only fixes. PHP 8.2 is in security-only support until December 31, 2026, PHP 8.3 until December 31, 2027, and PHP 8.4 until December 31, 2028. Moving to 8.3 or 8.4 buys the longest runway before the next migration.
Why is moving from PHP 7 to 8 more than a version bump?
Because PHP 8 introduced breaking changes — stricter type handling, removed and changed functions, altered error behavior — and many real applications depend on framework and library versions that themselves need upgrading in lockstep. The code runs, but it does not run unchanged. Done incrementally, each part is migrated and proven equivalent before cutover rather than flipped all at once.
Who provides PHP migration services?
We do — PHP migration and modernization services are part of what we do. We move a PHP application off an unsupported version slice by slice, taking the framework and dependencies along with the runtime and proving each route group or module equivalent to the legacy before it carries live traffic. We sell the migration itself, not licenses or tools, and we'll tell you when a straightforward step-up is all you need rather than manufacture a bigger project.
How much does a PHP migration cost?
It scales with the application, not a list price. The drivers are how far behind the PHP version is, whether the framework has aged out alongside it, how many slices the codebase breaks into, the dependencies and extensions pinned to the old runtime, and how much parity has to be proven before each cutover. Our [legacy cost calculator](/legacy-cost-calculator) gives a directional estimate, and a [discovery call](/meet) scopes the real number against your codebase.
How do I choose a PHP modernization partner?
Judge a partner on how they de-risk the move, not how fast they promise to finish. Look for incremental, slice-by-slice migration over a single risky cutover; proof that each slice behaves identically to the legacy before traffic shifts; senior-engineer review of AI-accelerated discovery so the undocumented logic isn't lost; and the honesty to say when a plain step-up to a supported PHP release is the right answer. Matching the effort to the actual gap should be part of the assessment, not an upsell.