Free tools Windows power users keep installed
One-click scans. No signup required.
On Ubuntu or Debian, downgrading PHP is a compatibility and dependency exercise, not a single command. Identify your distribution release, the PHP branch the application needs, the active SAPI (CLI, Apache module, or PHP-FPM), and every required extension. Then install a compatible target, switch each runtime separately, restart the affected service, and verify both command-line and web requests.
Need a server to try this on? Antihost offers Linux VPS plans with NVMe storage, full root access and a 14-day free trial.
For most systems, installing the older branch alongside the current one is safer than forcing an in-place package downgrade. An exact APT downgrade is appropriate only when matching package versions and dependencies still exist for the same distribution release. A source build is the fallback when no binary package fits, but it creates a separate maintenance responsibility.
As an Amazon Associate I earn from qualifying purchases.
What “downgrading PHP” actually changes
Linux can run more than one PHP branch at the same time. The PHP executable used by a shell is the CLI SAPI; Apache can load a PHP module; Nginx normally forwards requests to a PHP-FPM socket. These are separate integration points. Changing php -v does not automatically change Apache or Nginx.
A downgrade therefore has two possible meanings:
- Parallel installation: install the required older branch, then select it for the CLI and point the web server at its module or FPM socket. The existing branch remains available for other applications.
- Exact package downgrade: replace currently installed packages with older revisions from the same distribution repositories. This is more fragile because APT must satisfy every dependency at compatible versions.
Before touching packages, record the current state and make a tested backup of application configuration and databases. Use a staging host or disposable virtual machine when the service is production-critical.
#1 Best Overall
Check the operating system, PHP branch and SAPI first
Package names and available branches depend on the Linux release and repository configuration. Do not copy an Ubuntu command to an unrelated distribution or mix packages built for different releases.
- Identify the distribution and release using the system’s normal release information command, then note whether it is a standard-supported release or an expanded-security-maintenance release.
- Record the current CLI binary and configuration:
php -v
php --ini
dpkg -l | grep -E '^ii php'
- Determine how web requests are handled. Apache may use
libapache2-mod-php; Nginx generally uses PHP-FPM. Check the enabled Apache modules or the FastCGI socket configured by Nginx. - List the extensions the application actually loads. Typical examples are MySQL, cURL, XML, mbstring, GD and ZIP. Every extension must match the target branch.
Keep the output of these checks with your change record. It lets you distinguish a CLI-only change from a web-runtime change and gives you a rollback reference.
Check support and application compatibility before choosing a branch
PHP branches receive two years of active support followed by two years of critical-security-only support. After four years, a branch reaches end of life and is no longer supported. The PHP supported-versions table currently lists these security-support dates:
| PHP branch | Security support ends |
|---|---|
| 8.2 | 31 December 2026 |
| 8.3 | 31 December 2027 |
| 8.4 | 31 December 2028 |
| 8.5 | 31 December 2029 |
These dates are branch policy dates, not a guarantee that your Linux distribution will package every branch for its entire lifetime. Compare a candidate on four axes:
- Application compatibility: confirm that the framework, extensions and vendor libraries support the branch.
- Extension availability: check that the required modules exist for your release and repository.
- Security-support remaining: an old API may be easier to preserve temporarily on a supported branch than by moving to an end-of-life runtime.
- Operational complexity: parallel packages, an exact downgrade and a source build have different upgrade and rollback risks.
If the application needs only an older API or extension, first test whether a supported newer branch plus a compatibility change solves the problem. A downgrade can expose the application to unpatched defects once the selected branch is out of support. Document a migration deadline whenever a legacy branch is unavoidable.
Method 1: install a parallel PHP version
Parallel installation is usually the least disruptive option on Ubuntu LTS and Debian-family systems. The Ondřej Surý PHP PPA provides co-installable PHP 5.6, 7.x and 8.x packages and many commonly requested extensions for current Ubuntu LTS releases. Expanded Security Maintenance releases are not supported by that PPA. Packages from a PPA are third-party builds, so record the repository and Ubuntu release in your change documentation.
Outdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware matchPC Slower Than It Used to Be?
A free scan shows the junk files, broken settings and background clutter dragging Windows down - then fixes them in one click.Free scan · Windows 10 & 111. Refresh APT and inspect candidates
Ubuntu recommends APT for Debian packages, and apt update refreshes the local package indexes:
sudo apt update
apt-cache policy php8.2 php8.2-cli php8.2-fpm
Replace 8.2 with the branch you have selected. The policy output shows whether the branch is available and which repository would supply it. If there is no candidate, stop and resolve the repository or release mismatch rather than forcing installation.
2. Install the target runtime and matching extensions
Install the target CLI, common files, web SAPI and only the extensions the application uses:
sudo apt install php8.2-cli php8.2-common php8.2-fpm
Add matching packages such as php8.2-mysql, php8.2-curl, php8.2-xml, php8.2-mbstring, php8.2-gd or php8.2-zip when required. Exact package names and available branches vary by release, so inspect them first with commands such as:
apt-cache search php8.2
apt-cache policy php8.2-mysql php8.2-curl php8.2-xml php8.2-mbstring php8.2-gd php8.2-zip
Installing only the target branch’s extensions avoids a common failure in which the interpreter is older but a module was compiled for the newer branch.
3. Select the CLI binary
After a parallel install, php -v may still report the newer executable. Debian-family systems use the alternatives mechanism to select the command-line binary:
sudo update-alternatives --config php
php -v
php --ini
Choose the path belonging to the target branch, then confirm that the reported configuration directory is the expected versioned tree. PHP uses separate trees such as /etc/php/8.x/cli and /etc/php/8.x/apache2; changing the CLI alternative does not rewrite the Apache or FPM configuration.
4. Configure Apache
If Apache embeds PHP through a module, install the matching module and enable only the branch you intend Apache to load:
The Tool Desk
Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →sudo apt install libapache2-mod-php8.2
sudo a2dismod php8.3
sudo a2enmod php8.2
sudo systemctl restart apache2
Use the actual currently enabled module in the a2dismod command; the example assumes 8.3 is the branch being replaced. If Apache reports a module or configuration error, inspect its service status and error log before retrying. A successful CLI check alone does not prove that Apache is using the same branch.
5. Configure Nginx with PHP-FPM
Nginx does not load a PHP module. Install and start the target FPM service, then change the site’s FastCGI configuration to the target socket, for example the socket under /run/php/ associated with the selected branch. Validate the Nginx configuration and restart both services:
sudo systemctl enable --now php8.2-fpm
sudo nginx -t
sudo systemctl restart php8.2-fpm
sudo systemctl reload nginx
The exact socket name and service unit depend on the branch and distribution. Check the pool configuration rather than guessing. Leaving Nginx pointed at the old socket is a frequent reason a downgrade appears ineffective.
6. Verify a real web request
Create a temporary, access-controlled diagnostic endpoint containing <?php phpinfo();, request it through the same virtual host as the application, and confirm the PHP version, SAPI and loaded extensions. Remove the endpoint immediately after checking; a public phpinfo() page discloses paths, modules and configuration details. An application health endpoint that reports its runtime can be safer when available.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
Method 2: request an exact APT package downgrade
APT accepts an explicit package version with the form package=version. This method is viable only when the target revision and every tightly coupled PHP package are still published for the same distribution release.
Inspect the available revisions
apt-cache policy php-cli php-common php-fpm
apt-cache madison php-cli
Record the candidate versions before changing anything. Ordinary APT priorities do not normally trigger downgrades, and version-selection mechanisms can remove or downgrade dependencies unexpectedly. Never mix packages built for another Ubuntu or Debian release.
Plan the complete transaction
Include the PHP core, SAPI package and extensions in the same compatibility plan. Ubuntu’s package guidance notes that an exact-version request can fail when dependencies remain at newer revisions; its worked approach installs matching dependency packages first and repeats the exact-version request. APT will warn that it is downgrading and ask for confirmation.
Rank #4
Review the proposed transaction carefully. If it wants to remove modules the application needs, or a large part of the server or desktop stack, answer no. Restore the repository state and reassess candidates instead of accepting a destructive resolution.
Recommended Free Tools
Protect the system before applying it
- Back up PHP configuration, virtual-host files and application databases.
- Save the output of
apt-cache policyand the list of installed PHP packages. - Test the exact transaction on staging or a disposable VM.
- Plan a rollback using the recorded package versions and configuration backup.
Exact downgrades can leave a coherent, older stack, but they also make future unattended upgrades and security updates harder to reason about. Add package holds only when you have an explicit maintenance process to review and remove them.
Method 3: build PHP from source
Most Linux distributions provide packaged PHP, but the official Unix installation documentation also supports source builds when you need precise control over features, extensions or server APIs. Use this route when no compatible binary package exists, not as a shortcut around dependency planning.
Install the compiler toolchain and development libraries required by the chosen PHP release, then build the exact patch version under a deliberate prefix such as /opt/php/<version>. Keep that installation separate from distribution-managed /usr/bin/php unless you have a clear alternatives policy.
A production source build needs more than a compiled binary:
Quick wins for a faster PC:
Clear out junk files and repair common Windows errorsFree Scan →Scan for outdated or missing drivers - takes under a minuteDriver Scan →Repair Windows errors before they cause bigger problemsFix Now →- a documented configure command and compiler toolchain;
- the intended
php.iniand extension set; - a service unit or FPM pool with controlled permissions;
- an upgrade and rollback procedure;
- a process for tracking security fixes, because the distribution package manager will not maintain the custom build automatically.
Run the application against the source-built runtime in staging first. Do not overwrite the system PHP until the service definition, logs, file permissions and web-server integration have been tested.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Verify both runtimes after the change
Run this checklist for every host:
php -vreports the intended CLI branch.php --inipoints to the intended CLI configuration.php -mlists every extension required by the application.- Apache is loading the intended module, or Nginx is connected to the intended PHP-FPM socket.
- A request through the production virtual host reports the intended web SAPI and version.
- The application’s dependency manager, automated tests and staging smoke tests pass on the target branch.
- Apache, Nginx and PHP-FPM logs are clean after restart or reload.
- Repository files, alternatives selections and any package holds are documented so unattended upgrades cannot silently switch branches.
Check the web path separately from the shell. A correct php -v with an old FPM socket still means the website is running the old configuration, not the one you selected for the CLI.
Best Value
- New
- Mint Condition
- Dispatch same day for order received before 12 noon
- Guaranteed packaging
- No quibbles returns
Common failures and how to recover
The target package has no installation candidate
The branch may not be built for your distribution release, the repository metadata may be stale, or the release may be outside the repository’s support range. Run sudo apt update, inspect apt-cache policy, and verify that every configured repository matches the operating-system release. Do not install a package from another release merely to obtain a version number.
APT proposes removals or conflicting dependencies
Stop the transaction. Mixed repositories, unmatched extension revisions or a branch that is absent from the release can produce a removal cascade. Restore repository configuration, capture the proposed package list, and test a parallel installation or a staging upgrade instead.
The CLI changed but the website did not
CLI alternatives affect shell commands only. For Apache, enable the matching module and restart Apache. For Nginx, point the site at the matching FPM socket, restart the FPM service and reload Nginx. Confirm the result through the actual virtual host rather than a local CLI test.
An extension is missing after the switch
Install the extension package for the target branch, not the unversioned or newer-branch package. Re-run php -m for the target SAPI and inspect startup warnings in the service log. Some applications also need a separate FPM restart before a newly installed module is loaded.
Apache or PHP-FPM fails to start
Read the service status and error log, then check for a module built for a different PHP branch, a duplicate module directive, an invalid php.ini setting or a socket path that no longer exists. Re-enable the last known-good module or socket, restore the backed-up configuration, and restart before attempting another package change.
Unattended upgrades switch the branch later
Document the enabled repositories and alternatives selection. If a temporary package hold is necessary, record who owns it, which security updates it blocks and the date it must be reviewed. A hold without an upgrade plan can leave a legacy branch exposed after its support window.
Do these 3 things before closing this tab:
1Repair Windows errors before they cause bigger problems2Fix the driver behind crashes, sound loss and screen glitches3Clear out junk files and repair common Windows errorsChoosing the safest approach
| Situation | Preferred approach | Main trade-off |
|---|---|---|
| The target branch is available for the current release and another application needs the newer branch | Parallel installation with separate CLI and web-SAPI selection | Two runtimes and extension sets must be maintained |
| Exact older revisions and all dependencies are available from the same release repositories | Carefully planned APT version downgrade | Dependency resolution can remove required packages or complicate updates |
| No suitable binary package exists, but a specific patch release or server API is required | Isolated source build | You own compilation, service integration and security patch tracking |
| The application only needs an older API or extension | Test a compatibility change on a supported PHP branch first | May require application or dependency updates instead of a runtime change |
For legacy production systems, commercial support for older Debian and Ubuntu PHP packages is available through services associated with the package maintainers; confirm current program terms directly before purchasing. Regardless of support arrangements, keep an exit plan for the old branch.
Rollback and long-term maintenance
Rollback is easiest when the previous runtime remains installed. Switch the CLI alternative back, restore the prior Apache module or FPM socket, restart the affected services, and verify a real web request. If you performed an exact downgrade, reinstall the recorded versions or restore the tested host image rather than improvising package selections.
After service is stable, schedule the migration that made the downgrade necessary. Track the PHP branch’s support end date, application-library compatibility, extension availability and operating-system lifecycle in the same change record. Review repository configuration after every distribution upgrade; a branch available on one Ubuntu LTS release may disappear on the next.
The Bottom Line
Install the required branch alongside the current one whenever possible, select CLI and web runtimes independently, and verify the application through its real web path. Use an exact APT downgrade only with matching packages from the same release, and isolate source builds with a documented security and upgrade plan.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

