Survey report · November 2026
The PHP Upgrade Blockers Survey 2026

What stops PHP teams from upgrading

In short

PHP upgrades rarely stall on one problem. The most common blockers are proving an upgrade is safe, proving it’s worth it, and untangling dependencies. That’s the picture from the 203 people who answered our opt-in survey between 27 July and 19 October 2026.

Responses
203
Fieldwork
July–October 2026
Method
Online survey, opt-in
Questions
22 blockers in 4 areas
Published by
Accesto
Edition
First, 2026
Lack of automated tests: 50%Tightly coupled monolith: 39%Deprecated core functions (mysql_*): 31%Lost institutional knowledge: 31%Stricter typing in PHP 8: 26%Composer dependency conflicts: 50%Obsolete framework version: 38%Abandoned plugins and packages: 33%Vendor code modified in place: 23%Custom C extensions: 7%Encrypted vendor code (ionCube): 7%No visible ROI: 51%“If it ain’t broke, don’t fix it”: 47%New features win over tech debt: 47%Refactoring costs exceed budget: 37%No PHP migration expertise: 13%Fear of downtime: 43%Fragile deployment pipelines: 21%No staging environment: 20%No DevOps expertise: 19%Outdated server OS: 13%Legacy shared hosting: 11%
CodebaseDependenciesBusinessInfrastructure
Illustration only: the 22 blockers drawn as lines of code. The more teams cite a blocker, the longer its line.
01Summary

Key findings

47–51%

No single blocker dominates#

The top five are each cited by 47–51% of respondents: no visible ROI (51%), missing automated tests (50%), Composer dependency conflicts (50%), the “if it ain’t broke” mindset (47%) and features winning over tech debt (47%).

6.6 of 22

Blockers come in bundles#

Respondents cite 6.6 of the 22 listed blockers on average, and 68% cite five or more. 58% cite at least one blocker in each of the four areas: the codebase, dependencies, business and infrastructure. The count climbs with tech debt, from 4.5 for apps rated low to 7.6 for high and 8.4 for critical.

86%

Business reasons lead#

86% cite at least one business or resource blocker, the highest of the four areas and just ahead of dependencies (81%). Three of the five most-cited blockers are about the business case: no visible ROI (51%), the “if it ain’t broke” mindset (47%) and features winning over tech debt (47%). They rarely come alone, though: only 11 of the 175 who cite a business blocker cite no technical one.

56% vs 28%

“We can’t upgrade” often means “we can’t verify”#

Missing automated tests is among the most-cited blockers, yet 53% of those who cite it do run automated tests, probably not ones they trust for a version jump. Respondents who cite missing tests or a missing staging environment also fear downtime more often (56% vs 28%), though part of that gap comes from people who tick more boxes overall.

23%

of respondents’ apps still run PHP 7 or 5#

In Brent Roose’s Packagist stats for July 2026, PHP 7.4, the only pre-8 version listed, is down to 5%, though our respondents lean toward teams with upgrade problems. These apps cite refactoring costs, an obsolete framework version and a tightly coupled monolith far more often than apps on PHP 8 (59–63% vs 29–33%).

9.2 vs 6.8

Engineering practices differ between the two groups#

Apps on PHP 8 use 9.2 of 17 listed practices on average, older apps 6.8: about two fewer, even at the same app age. The widest gaps, PHP 8 vs older, are in automating the delivery pipeline: tests (71% vs 41%), deployments (58% vs 29%) and database migrations (56% vs 27%).

Base: all 203 respondents unless a group is named. Multiple answers allowed, so shares don’t add up to 100%.

They sayPeople from the PHP community commented on these findings. Their comments sit next to the passages they answer, as personal views rather than survey results: Nicolas Grekas on deprecations, Nils Adermann on Composer conflicts, Michał Kurzeja on AI, Kevin Bond on tests, Tomasz Kowalczyk on ROI, Gina Peter Banyard on PHP 8, Leszek Prabucki on the business case.

02Background

Why we ran this survey

The idea came from the State of PHP 2026 survey by The PHP Foundation and JetBrains PhpStorm, which, when we took it, included a question on upgrade blockers. Upgrades are our daily work at Accesto, so we wanted to go deeper: 22 specific blockers in four areas, plus the context of the app behind each answer.

Public numbers make PHP look modern. In Brent Roose’s Packagist stats for July 2026, PHP 8.4 is the most-used version and PHP 7.4 is down to 5%. But Packagist counts Composer installs, so busy, modern projects dominate it. The internal CRM built in 2012, or the custom shop nobody dares to touch, barely registers.

The clock is running, too. PHP 8.2’s security support ends on 31 December 2026, after which only 8.3 and newer are supported.

Figure 1Security support by PHP branch

as of October 2026
PHP 5.6ended 31 Dec 2018PHP 7.4ended 28 Nov 2022PHP 8.0ended 26 Nov 2023PHP 8.1ended 31 Dec 2025PHP 8.2until 31 Dec 2026PHP 8.3until 31 Dec 2027PHP 8.4until 31 Dec 2028PHP 8.5until 31 Dec 2029
no security fixeslast fixes in 2026supported

All 46 apps in this survey that run PHP 7 or 5 are on versions that have had no security fixes since at least 28 November 2022, when PHP 7.4 reached end of life.

Dates from php.net: supported versions and end-of-life branches. PHP 5.6 and 7.4 were the last releases of PHP 5 and PHP 7.

03Respondents

Who answered

Mostly mature business apps, maintained by small teams: the median app is 8 years old.

Figure 2PHP version in use

n = 202

Figure 3Tech debt, self-rated

n = 202

Figure 4Dev team size

n = 197 · average over the app’s life

Figure 5Codebase size

n = 195 · lines of code

Figure 6App age

n = 187 usable answers · median 8 years

Figure 7Kind of app

n = 190 · free text, tagged · several allowed · business systems are CRM, ERP, HR or finance

Figure 8Framework

n = 182 · free text, tagged · several allowed

Figure 9Apps still on PHP 7 or older, by app age

share of each age group

77% of apps run PHP 8.x, possibly including 8.0 or 8.1, which no longer get security fixes. Older apps are more often still on PHP 7 or 5: 14–16% under ten years, 38% at 15 or more.

SaaS products are the most common type (36%), followed by business systems such as CRM or ERP (24%), websites (23%) and APIs (19%). 35% rate their tech debt as high or critical.

04The main question

The full ranking

No single blocker dominates: the top five are each cited by 47–51% of respondents, and they come from three different areas.

Business leads even though it offered five options, against six for dependencies and infrastructure.

Figure 10Share of respondents citing each blocker

With 203 responses, a share near 50% carries a 95% margin of error of about ±7 points (sampling noise only; see “Bias” under About the data), so the top five (47–51%) are effectively tied. Groups are smaller and less precise. Hover or tap a bar for the count and its 95% range.

Show as a table

Figure 11How many of the 22 listed blockers each respondent picked

n = 203

Respondents cite 6.6 blockers on average (median 6). Only 8 of 203 named no blocker at all (5 left all four blocker questions blank, 3 only wrote a comment such as “None of the above”), all of them on PHP 8 with low or medium tech debt. Another 3 picked none of the listed blockers but described their own.

Figure 12Average number of blockers picked

out of 22 · by group

Groups under 30 respondents are marked; read them as indicative.

05By area

Blockers by area

Codebase and technical debt
78%cite at least one

Missing tests are the most-cited codebase blocker, and they make every other code issue harder to judge. 40 respondents cite both missing tests and lost institutional knowledge: nobody remembers what the code should do, and nothing checks it. Bigger codebases also report more debt: 52% of apps over 250k lines rate their debt high or critical, vs 22% of smaller ones.

Removed and deprecated functions aren’t only a PHP 5 problem: 31% of PHP 8 apps cite them too, about as many as older apps (28%). Stricter typing in PHP 8 is cited just as evenly (26% in both groups). PHP 8 keeps deprecating features (dynamic properties in 8.2, implicit nullable parameter types in 8.4), so every upgrade brings new ones.

Third-party dependencies
81%cite at least one

Composer conflicts hit every version. Among apps that use a dependency manager, 56% on PHP 8 and 50% on older versions cite them: an upgrade needs the whole dependency tree to support the target version at once. Older apps look less affected mainly because 27% of them don’t use a dependency manager at all (vs 8% on PHP 8).

An obsolete framework is the other trap. It is most common among CodeIgniter (9 of 12) and Zend (7 of 8) apps, though both groups are small, and it also comes up for 51% of Symfony apps (27 of 53) and 32% of Laravel apps (24 of 75). The Zend group includes 2 apps on Laminas or Mezzio, Zend’s successor projects. Of the 9 CodeIgniter apps that cite it, 7 already run PHP 8: the language moved on, the framework didn’t. Encrypted vendor code and custom C extensions are rare, but they can be hard stops where they appear.

Business and resources
86%cite at least one

As respondents see it, the mandate is a bigger gap than the skills. 85% cite at least one business-case problem: no visible ROI, the cost, competing priorities or “if it ain’t broke”. Missing PHP or DevOps expertise comes up for 25%.

Infrastructure and operations
69%cite at least one

Hard limits are rarer than fear. Fear of downtime is cited more than three times as often as either an outdated server OS or legacy shared hosting.

Figure 13Who cites an obsolete framework version

share of each framework’s apps · respondents could name several frameworks

Frameworks named by fewer than 8 respondents are left out. Groups this small are indicative: 7 of 8 Zend apps is a striking share, but it is still eight apps.

06Verification

“We can’t upgrade” often means “we can’t verify”

56%

cite missing tests or a missing staging environment: 113 of 203.

56% vs 28%

fear downtime: those who cite either gap (63 of 113) vs the rest (25 of 90).

53%

of those who cite missing tests do run automated tests (51 of the 97 who also answered the practices question).

Figure 14Fear of downtime

by whether respondents cite missing tests or no staging

Missing automated tests is among the most-cited blockers (50%), and 56% of respondents cite missing tests or a missing staging environment. Those respondents also fear downtime more often: 56% vs 28% of the rest. Part of that gap comes from respondents who simply tick more boxes; after accounting for that, the odds are still nearly twice as high, though at this sample size the evidence is suggestive rather than conclusive.

Figure 15Cite “lack of automated tests”

by whether they run automated tests · n = 195 who answered the practices question

Missing tests aren’t always missing. 53% of the respondents who cite them do run automated tests. Probably the suite doesn’t cover enough to trust a version jump, though some answers may describe an earlier upgrade. A new PHP version changes behaviour, not just syntax, and only tests that pin today’s behaviour will catch that.

That’s why an upgrade should start with a safety net, not a version bump.

07PHP 8 vs older

What separates PHP 8 apps from older ones

Apps still on PHP 7 or 5 aren’t just older. They cite costlier blockers, carry more tech debt and run fewer safety nets.

Figure 16Blockers by PHP version

share of each group citing the blocker · sorted by the gap
PHP 7.x or older (n = 46)PHP 8.x (n = 156)cleargap holds after correction

Five gaps hold after the correction for multiple comparisons. Four run against older apps: refactoring costs, an obsolete framework version and a tightly coupled monolith (59–63% of older apps vs 29–33% on PHP 8), and missing automated tests (67% vs 45%). The fifth runs the other way: Composer conflicts (55% on PHP 8 vs 33% on older apps), but among apps that use a dependency manager the gap shrinks to 56% vs 50%, which is within noise. The other gaps don’t survive the correction; with 46 older apps, treat them as indicative. App age alone doesn’t explain these gaps: in every age band, apps on PHP 7 or older cite each of the four more often than PHP 8 apps of the same age, and with age held constant the odds stay 2.4–4.0 times higher.

“Clear” gaps hold after a Benjamini–Hochberg correction across all 39 PHP-version comparisons on this page (22 blockers, 17 practices; q under 0.05). Treat the rest as indicative. Composer conflicts is the one clear gap that runs the other way; the next panel shows it mostly reflects older apps that use no dependency manager. Hover or tap a row for counts and q.

Show as a table

Figure 17Composer conflicts, compared fairly

share of each group
PHP 7.x or olderPHP 8.x

Across all apps, 55% on PHP 8 and 33% on older versions cite Composer conflicts. Among apps that use a dependency manager, the gap shrinks to 56% vs 50%, within noise. The overall gap comes mostly from the 27% of older apps that use no dependency manager at all (vs 8% on PHP 8).

Figure 18Self-rated tech debt by PHP version

share of each group

64% of apps on PHP 7 or older rate their tech debt high or critical, vs 26% on PHP 8. All shares: PHP 8.x low 27%, medium 47%, high 24%, critical 2%; PHP 7.x or older low 2%, medium 33%, high 44%, critical 20%.

Figure 19Engineering practices by PHP version

share of each group using the practice · n = 41 vs 153 who answered
PHP 7.x or older (n = 41)PHP 8.x (n = 153)cleargap holds after correction

The widest gaps are in the delivery pipeline: automated tests, deployments and database migrations. Overall, older apps use 6.8 of the 17 listed practices on average, against 9.2 on PHP 8, about two fewer even at the same app age. Debt follows the same line: 64% of PHP 7-or-older apps rate their tech debt high or critical, vs 26% on PHP 8, and that gap holds at the same app age too. This is a correlation, not proof: teams that invest in practices may simply be the teams that also upgrade. In our experience, these practices are also what make the next upgrade cheaper.

Show as a table
08Co-occurrence

Blockers that travel together

Respondents cite 6.6 blockers on average, so blockers rarely come alone. Pick one to see how often the people who cite it also cite each of the others, compared with everyone else.The chart shows how often the people who cite one blocker also cite each of the others, compared with everyone else.

Figure 20What else people pick

People who cite one blocker tend to cite more of them, so most filled dots sit to the right of their rings. The widest gaps, at the top, show which blockers go together. This view is descriptive; no significance test is applied.

Figure 21The most common pairs

respondents citing both · share of all 203
09Context

Engineering practices

Version control (98%) is close to universal, and most use dependency management (88%). The least common are centralized logging, infrastructure as code and infrastructure observability (25–31%).

Figure 22Practices in use

Of 17 listed practices. Shares use the 195 respondents who answered the practices question.

Figure 23Average number of practices in use

out of 17 · by group

Overall, respondents use 8.7 of the 17 practices on average (median 8). Bigger teams run more of them.

Groups under 30 respondents are marked; read them as indicative.

10Free text

In their own words

33 respondents added answers of their own. Most echoed the list; dependency compatibility, environment constraints and lack of time came up most often. A few that stuck with us (anonymous, lightly edited for spelling and grammar):

“Upgrade ROI is mostly avoided future risk rather than immediately visible functionality, so the work tends to be postponed until security, dependency or infrastructure constraints turn it into an urgent project.”

Figure 24Themes in the free text

answers per theme · 44 answers from 33 respondents

“Dependencies not supporting latest versions is the number 1 blocking limitation.”

“There are no tools that help measure the cost of outdated PHP versions and packages.”

“Low code quality makes most of the other answers to this question an uncertainty.”

“Insufficient production-parity validation and rollback confidence for runtime-level upgrades.”

“Economic reasons: a two-year LTS on Ubuntu provides little benefit of 8.4 over 8.3.”

“Last time I was tasked with updating the legacy app (PHP 7.3, Symfony 3.4), the management was actually the one pushing this decision.”

Answers are anonymous and lightly edited for spelling and grammar. 20 “Other” entries held stray text rather than an answer, probably left by browser autofill; they were removed and aren’t shown.

11Recommendations

What to do about it

Every blocker at the top of the list has a known way through. This is where we’d start:

  1. Build the safety net before touching the version. Pin today’s behaviour with characterization tests on the paths that make money, then run the suite on the target PHP version in CI. Static analysis (PHPStan or Psalm, set to the target PHP version) catches many incompatibilities before production does.
  2. Map the dependency graph first. composer why-not php 8.4 lists the packages that block a target version. To check whether your current version constraints resolve on the target version, set config.platform.php to it and run composer update --dry-run. composer audit flags abandoned packages (since Composer 2.7 it fails on them by default): replace or fork those, and plan the framework upgrade together with the PHP one.
  3. Let tools do the repetitive part. Rector applies version-to-version code changes across a whole codebase. Compile-time deprecations, like implicit nullable parameter types, can be detected and fixed automatically. Runtime ones, like dynamic properties, appear only when the code runs, so lean on the tests from step 01 and the deprecation notices in your logs.
  4. Remove the fear with production parity. A staging environment that mirrors production and a tested rollback plan turn a risky event into a routine deploy.
  5. Make the business case with risk, not features. Support ends on a known date (31 December 2026 for PHP 8.2). Put the cost of staying behind next to the cost of upgrading: security exposure, hosting and OS support, compliance, hiring, performance.
  6. Make upgrades routine, not projects. Small, regular bumps of PHP and dependencies cost far less than one big jump every five years.
  7. Migrate obsolete frameworks incrementally. CodeIgniter 3, Zend Framework 1, symfony 1 and Yii 1.1 have no in-place upgrade path: the next major version is effectively a different framework. The Strangler Fig pattern moves one module at a time while the product keeps shipping.
12Read with care

About the data

  • Sample: 203 responses collected from 27 July to 19 October 2026 through an opt-in Google Forms survey (people chose to take part, so it isn’t a random sample), promoted mainly on LinkedIn. Answers are self-reported. Leaving an email was optional (to receive the results), and all answers are reported anonymously. Each response describes one app; a few people answered for more than one.
  • Timing: the PHP version question asked about “right now”, but at least 9 answers describe a migration done or under way (a framework given as “Laravel 8 to 13”, for example), so some blockers may be remembered from an earlier upgrade. That blurs the PHP 8 vs older comparison a little.
  • Bias: people with upgrade problems are more likely to answer a survey about upgrade blockers, and the survey was run by an upgrade consultancy (Accesto) and shared mainly through its own network. Read the shares as “among respondents”, not “among all PHP apps”.
  • Questions: blockers were tick-all-that-apply in four areas, each with an “Other” field, and not ranked: a share shows how widespread a blocker is, not how much it weighs. A few options were worded strongly (“Catastrophic downtime fears”, “Dependency hell”), and respondents’ roles weren’t asked. Blocker shares use all 203 responses as the base; profile shares use those who answered each question. Practice shares use the 195 who answered that question (5 of 46 older apps and 3 of 156 PHP 8 apps skipped it). Shares are rounded, so they may not add up to 100%.
  • Comparisons: apps on PHP 8.x (n = 156) vs PHP 7.x or older (n = 46), tested with Fisher’s exact test. Gaps marked “clear” hold after a Benjamini–Hochberg correction across all 39 comparisons; treat the rest as indicative. The version gaps were rechecked with app age held constant (logistic and linear regression on the 186 apps with a PHP version and a usable age; 181 for practices). The link between verification gaps and fear of downtime was also checked against how many other blockers each respondent picked (Mantel–Haenszel odds ratio 1.85, p = 0.10).
  • Cleaning: 20 “Other” entries held stray text rather than an answer, probably left by browser autofill, and were removed. Free-text answers were grouped by theme. App ages typed as text were normalized, and 8 answers that covered several projects or were ambiguous were left out. The team-size question was re-created mid-survey, and both versions were merged: where someone answered both (8 people), the newer one counts (2 of them differed).
  • Comments: the “They say” comments are personal views from people in the PHP community, not survey results. We shared the report with them before publication, and each approved the wording of their comment. They speak for themselves, not for the organizations they work with. The exception is Michał Kurzeja, Accesto’s CTO, whose comment gives our own view.
  • Sources: State of PHP 2026 survey announcement (The PHP Foundation, 9 June 2026) · PHP version stats, July 2026 (stitcher.io) · Supported versions (php.net, checked 19 October 2026).
The 22 blockers as asked
AreaIn this reportAnswer option in the survey
CodebaseLack of automated testsLack of automated testing: No safe way to verify if a version jump breaks edge cases.
CodebaseTightly coupled monolithMonolithic architecture: Tightly coupled code makes incremental upgrades impossible.
CodebaseDeprecated core functions (mysql_*)Deprecated core functions: Reliance on removed features like mysql_* requires massive rewrites.
CodebaseLost institutional knowledgeLost institutional knowledge: Current team lacks context to safely modernize undocumented legacy logic.
CodebaseStricter typing in PHP 8Strict typing enforcement: PHP 8+ turns silent warnings into fatal application crashes.
DependenciesComposer dependency conflictsDependency hell in Composer: Updating one package causes unresolvable conflicts with others.
DependenciesObsolete framework versionLegacy frameworks: The app uses obsolete versions of Zend, CodeIgniter, or Symfony.
DependenciesAbandoned plugins and packagesAbandoned plugins: Tools like old WordPress or Magento extensions are no longer maintained.
DependenciesVendor code modified in placeModified external libraries: Vendor code was modified & saved directly into the codebase
DependenciesCustom C extensionsCustom C extensions: Proprietary server extensions compiled for PHP 5.x/7.x require a rewrite.
DependenciesEncrypted vendor code (ionCube)Encrypted vendor code: Reliance on obfuscated tools like ionCube that lag behind new PHP releases.
BusinessNo visible ROIZero visible ROI: Upgrades add no features, making it hard to justify the expense to executives.
Business“If it ain’t broke, don’t fix it”The if it ain't broke, don't fix it mindset: Stakeholders fear touching a stable system.
BusinessNew features win over tech debtCompeting product priorities: Management prioritizes shipping new features over paying technical debt.
BusinessRefactoring costs exceed budgetProhibitive refactoring costs: Total developer hours to rewrite and test exceed the IT budget.
BusinessNo PHP migration expertiseLack of dedicated PHP expertise: Team has shifted to other languages and lacks migration experience.
InfrastructureFear of downtimeCatastrophic downtime fears: Upgrading a live system risks revenue loss or customer trust.
InfrastructureFragile deployment pipelinesFragile deployment pipelines: Legacy CI/CD scripts break when introduced to modern containers.
InfrastructureNo staging environmentNo staging environments: Testing directly in production is viewed as an unacceptable risk.
InfrastructureNo DevOps expertiseLack of DevOps expertise: Team doesn't know how to safely proceed with migration.
InfrastructureOutdated server OSTethered OS dependencies: The underlying server OS is outdated and doesn't support modern PHP.
InfrastructureLegacy shared hostingLegacy shared hosting: Projects live on hosting plans that do not offer newer PHP environments.
13Colophon

Who made this

This report is by Accesto. We modernize and scale PHP products, so upgrades are our daily work. We ran the survey to see where other teams get stuck, and we publish the results openly for the PHP community.

Thank you to everyone who took the time to answer: 203 responses in all.

If you have questions about the data, ideas for the next edition, or would like to compare notes on your own upgrade, get in touch.

How to cite

Accesto (2026). What stops PHP teams from upgrading: The PHP Upgrade Blockers Survey 2026. https://accesto.com/reports/php-upgrade-blockers-2026/

Quoting a number or sharing a chart? “Source: Accesto, The PHP Upgrade Blockers Survey 2026” and a link is enough.

Next edition

Get it first in PHP at Scale, Accesto’s newsletter.