
PHP Upgrade Check for OpenCart — what will break after switching to PHP 8.3, 8.4 or 8.5
A module for OpenCart 4, 3 and 2.3 that reads every PHP file of the shop — core, extensions, OCMOD and vQmod patches, themes and libraries — and compares it with what PHP 7.0 … 8.5 removed or changed. For the PHP version you pick, every extension gets a verdict: ready, only notices, will break, needs a PHP extension or encoded, and every finding comes with the file, the line and the fix. Nothing is executed and nothing is changed. The basic version is free; Pro adds a report for your developer and error-log analysis. Lifetime licence.
- Compatibility
- OpenCart 4.0.2 – 4.1.x (tested on 4.1.0.3 with mysqli and 4.0.2.3 with pdo), 3.0.x (tested on 3.0.5.0) and 2.3.0.x (tested on 2.3.0.2) · verdicts for PHP 7.4, 8.0, 8.1, 8.2, 8.3, 8.4 and 8.5 · the module runs on the same PHP as the shop (tested on 5.6, 7.0, 8.1, 8.3 and 8.5) · MySQL / MariaDB · module languages: Ukrainian, English, Russian
- Version
-
v1.1.0 (OpenCart 4)
v1.1.0 (OpenCart 3.x)
v1.1.0 (OpenCart 2.3) - Licence
- one site, lifetime
- Trial
- 7 days, no card, one per site
- Updated
- October 2026
What Free has,
and what Pro adds
The free version works with no time limit. Pro adds the rest of the features in the table.
What it looks like
Key points
What the shopper sees
The shopper never sees the module: there is no code, event or patch of it on the storefront.
What the admin gets
The System → PHP Upgrade Check menu entry with four tabs: Overview, Report, Error log (Pro) and Settings.
What is tested and what is not
Tested locally on four OpenCart versions from the official archives: 4.1.0.3 (mysqli), 4.0.2.3 (pdo), 3.0.5.0 and 2.3.0.2, on PHP 5.6, 7.0, 8.1, 8.3 and 8.5, with “Display errors” on and off.

The trial starts when you ask
A fresh install is the free version, nothing switches on by itself. The “Try Pro for 7 days” button → e-mail → the key right in the window and by e-mail.

One key — one site
Moving the store? Unbind the licence on the old domain and activate it on the new one yourself. For studios — keys for 5 or 25 sites, or unlimited.
Technical requirements
OpenCart 4.0.2.0+ and 4.1.x (tested on 4.1.0.3 and 4.0.2.3), 3.0.x (tested on 3.0.5.0) or 2.3.0.x (tested on 2.3.0.2).
PHP — the one your shop runs on: the OpenCart 4 build needs 8.0+, like OpenCart 4 itself; the 3.x and 2.3 builds run on 5.6 and newer. Tested on PHP 5.6, 7.0, 8.1, 8.3 and 8.5.
The PHP tokenizer extension — the module reads code with it; cURL — for the Pro licence and the “newest release” button.
Database MySQL or MariaDB (tested on MariaDB 10.11).
OpenCart 2.3: the files are copied by hand, because the stock 2.3 installer needs FTP.
Module languages: Ukrainian, English, Russian.
Version history
For OpenCart 4, 3 and 2.3: scan of the core, extensions, OCMOD and vQmod patches, themes and libraries for PHP 7.0 … 8.5 changes; a verdict for every extension for PHP 7.4 – 8.5; PHP…
Frequently bought with PHP Upgrade Check for OpenCart
4 modules in one order — 40% cheaper than separately


Nova Poshta Premium — a Nova Poshta module for OpenCart 2.3, 3.x and 4.x

LiqPay — Card Payments for OpenCart 2.3, 3.x and 4.x

Telegram notifications and Viber/SMS for customers for OpenCart
Full module description
PHP Upgrade Check for OpenCart is a module by the CatCode studio that answers one question before you change the PHP version: what in this shop will stop working? PHP 8.1 gets no security fixes after 31.12.2025, PHP 8.2 gets them only until 31.12.2026 (php.net dates), and over the years the shop has collected modules by different vendors, OCMOD and vQmod patches and a theme with edits. Switching PHP “to try it” on a live shop means risking an error page instead of a product or the checkout.
The module reads every PHP file of the shop — the OpenCart core, extensions, the code of OCMOD and vQmod patches, themes, libraries — and compares it with what PHP 7.0 … 8.5 removed or changed, following the official php.net migration guides. For the PHP version you pick, every extension, patch and theme gets a verdict, and every finding comes with the file, the line, the code and the fix. Nothing is executed and nothing is changed.
What the shopper sees
The shopper never sees the module: there is no code, event or patch of it on the storefront. Its job is to keep the shopper from seeing something else: an error page instead of a product, a blank page or a checkout stuck at the payment step after the host switched PHP.
A shop breaks in different ways after a PHP switch. A function PHP removed (each(), create_function(), mysql_*) is simply not found, and the page stops with a fatal error. A deprecated function in OpenCart 4.0 – 4.1.0.3 with “Display errors” off sends the visitor to the error page. Some functions keep working but return a different result. The module finds these places before the switch, so you fix them on your own schedule rather than after shoppers complain.
What the admin gets
The System → PHP Upgrade Check menu entry with four tabs: Overview, Report, Error log (Pro) and Settings. The entry appears right after installation.
Overview
- This server now: the PHP version and its support status by the php.net dates, the “Check the newest release on php.net” button, the OpenCart version and the minimum PHP it demands (from system/startup.php), the database, the ionCube Loader, the PHP extensions OpenCart needs, memory_limit and max_execution_time.
- What this OpenCart does with a “Deprecated” notice: the module reads the error handler of your shop and says in plain words whether a deprecated function only lands in the log or sends the visitor to the error page.
- Scan: the PHP version picker (7.4 – 8.5), the “Scan now” button with progress and Stop, the date of the last scan, the number of files and the files that could not be read.
- Result: how many extensions and parts of the shop will break, need a PHP extension, give other results, are encoded, have only notices or are ready; the core files on their own line; the “Needs attention first” list.
Report
A “what — verdict — found” table for every extension, patch, theme and part of the core. “Details” opens the findings: the level, the file and line, the code itself, what changed and in which PHP version, the fix, and a “What to do” box — ask the vendor for a version for the PHP you need or let a developer fix the lines. The PHP version is switched with buttons without a new scan; the “Show ready ones”, “Show not installed” and “Show libraries” switches add what is hidden by default.
OCMOD and vQmod patches
A patch has no files of its own: its code is inserted into someone else’s file. The module reads the code of every OCMOD insertion from the database and every vQmod XML, and shows the finding with the patch name and the line of the file it changes — so you see straight away which module to ask for an update.
Error log (Pro)
For what only shows while the shop runs. Switch a copy of the shop (or the shop itself for a quiet hour) to the new PHP, go through the storefront, the cart, the checkout and the admin, then come back here: the module reads the OpenCart error.log and the PHP error_log, groups identical messages, counts how many times and when last, and traces each one to an extension, a patch or the core.
Settings
- Target PHP by default (8.3), whether to scan the core files and the vendor/ libraries.
- Extra folders to scan as well and paths to skip (an old copy in system/library, for example).
- Licence: a 7-day Pro trial or the key after purchase.
How it works, step by step
- File list. admin/ (including a renamed admin folder), catalog/, system/ without cache, logs, sessions and uploads, extension/ in OpenCart 4, PHP files in the shop root, vendor/ libraries (also outside the shop root), vQmod, the code of OCMOD patches from the database and the folders you add.
- Groups. Every file belongs to someone: an OpenCart 4 extension (name, version and author from the installer records or install.json), an extension from the OpenCart 3 installer, the core (by the official file list of your OpenCart line), an extension that ships with OpenCart (installed or not), a third-party extension, a theme, a library or “other files”.
- Reading. Every file is parsed with the PHP tokenizer — the same one PHP uses to read code — without running it. Large files are read with the memory_limit of the server in mind, and the ones that do not fit are listed as “check it by hand”.
- Rules. 92 functions, 6 whole extensions (mysql, mssql, mcrypt, imap, pspell, oci8), 30 constants and syntax and behaviour rules from the php.net migration guides for 7.0 … 8.5: each() and create_function() (removed in 8.0), $str{0} (8.0), strftime() (deprecated in 8.1), “${var}” in strings (8.2), a “Type $x = null” parameter without “?” (8.4), curl_close() and imagedestroy() (deprecated in 8.5) and more.
- No false alarms. An extension that is not installed is counted apart — its code does not run. A database driver config.php does not use stays silent. A function the shop declares itself (a polyfill) is not reported as removed. A line behind a PHP version check (PHP_VERSION_ID, version_compare, function_exists) is not counted where it never runs.
- Verdict. For the chosen PHP version every finding gets a level: will break, stops the page, needs an extension, result changes, cannot check, notice. The verdict of a group is the worst level of its findings. On OpenCart 4.0 – 4.1.0.3 with “Display errors” off a deprecated function counts as “Stops the page”.
- Then it is your turn. You switch the PHP version in the report without a new scan, update or fix the extensions and scan again until the verdict says “Ready”.
What is tested and what is not
Tested locally on four OpenCart versions from the official archives: 4.1.0.3 (mysqli), 4.0.2.3 (pdo), 3.0.5.0 and 2.3.0.2, on PHP 5.6, 7.0, 8.1, 8.3 and 8.5, with “Display errors” on and off. Every page and every action of the module — without a single PHP message in the log. The verdicts were checked against the expected ones on test extensions and real modules (Mollie 14.1.2, Mollie 9.4 with vQmod 2.6.6, d_quickcheckout). Awkward files — unreadable, binary, with a syntax error, in cp1251, with a BOM, nested 3,000 levels deep, symlink loops, files over 768 KB — the scan still reaches the end and lists what it could not read. A big shop — 60,836 files in 180 seconds. In the tests a test server stood in for the licence server.
Limits worth knowing. The scan is static: what only shows while the shop runs (null passed to a string function, an undefined array key, a float turned into an integer) it does not see — that is what the Pro “Error log” page is for. The rule about properties created on the fly (PHP 8.2) only checks classes without a parent class, __set() and traits, so it can miss some cases. Findings in vendor/ libraries matter only if something uses the library, so they are hidden by default. We have not tested real encoded modules by other vendors — only our own encoded test file. Not run live: OpenCart 4.0.0.x – 4.0.1.x and 4.1.0.4, 3.0.0 – 3.0.3.x (the core file lists cover them), MySQL 5.7, OCMOD packages for OpenCart 4, hosts without outgoing connections (there the php.net button just says it did not answer). The rules go up to PHP 8.5; later PHP versions will need a module update.
Under the hood
- Read-only. Files are parsed with the PHP tokenizer and never included or executed; the module writes to nobody’s files.
- One admin event — the menu entry under System. No storefront events, no OCMOD and no core edits.
- Own tables for the scan, the queue, groups, findings and marks; uninstalling removes them.
- AJAX steps of 6 seconds with a queue in the database: the scan does not hit max_execution_time and keeps going until it reaches the end.
- The module itself raises no PHP notices. On OpenCart 4 with “Display errors” off a single warning would send the admin to the error page, so every file access is silent, and an unreadable file simply lands on the list.
- Core file lists come from the OpenCart tags on GitHub: 2.0.0.0 – 2.3.0.2, 3.0.0.0 – 3.0.5.1, 4.0.0.0 – 4.1.0.4.
- php.net: the support dates of PHP versions are built in; the newest release is requested only on a button click and cached for a day.
- The licence lives in its own settings group, so saving the settings never touches it.
How to install
- OpenCart 4: Extensions → Installer → upload
cc_phpupgrade.ocmod.zip(keep the archive name) and click Install. OpenCart 3: Extensions → Installer →cc_phpupgrade-oc3.ocmod.zip. OpenCart 2.3: copy the contents of theupload/folder ofcc_phpupgrade-oc2.ocmod.zipto the shop root. - Extensions → Extensions → Modules → PHP Upgrade Check → Install.
- System → PHP Upgrade Check: pick the PHP version you are moving to and click “Scan now”.
- Open “Full report” and start with the “Needs attention first” list.
- For Pro: Settings → Licence — the 7-day trial or the key from the e-mail after payment.
Questions
about the module
Didn't find the answer? Message us on Telegram and we'll reply within a business day.
Does the module change anything in the shop or on the server?
No. It only reads PHP files and never runs them, it does not edit code and does not switch PHP. It writes results only to its own tables. There is nothing of it on the storefront: one admin event adds an entry to the System menu. You can run the scan on a live shop — it works in short steps of up to 6 seconds.
Will the module find everything that breaks after the switch?
No, and we say so plainly. A static scan sees what is visible in the code: removed functions and extensions, changed syntax, deprecated calls. Some changes only show while the shop runs: null passed to a string function, an undefined array key, a property created on the fly in a class with a parent. For those Pro has the "Error log" page: switch a copy of the shop to the new PHP, go through the storefront, the cart, the checkout and the admin — and every message is traced to its extension.
Why is a plain "Deprecated" marked "Stops the page" in the report?
Because that is what OpenCart 4.0 – 4.1.0.3 itself does: with "Display errors" off (and a live shop has it off) any PHP notice, "Deprecated" included, sends the visitor to the error page. We reproduced it on OpenCart 4.1.0.3 with PHP 8.5: category and product pages with images not yet in the cache went to error.html because of imagedestroy() in system/library/image.php:221 — the very line the module had shown in the report before the switch; on PHP 8.3 the same pages opened. OpenCart 4.1.0.4 changed this: there "Deprecated" is only written to the log. The module reads the error handler of your own shop and counts accordingly.
What do I do with an extension that "will break"?
The report shows exactly what: the file, the line, the code and the fix. Ask the extension vendor for a version for the PHP you need (with Pro, send them the HTML report) or let a developer fix those lines. Do not switch PHP on the live shop before that.
What if the problem is in OpenCart itself?
Findings in core files are shown as a separate "OpenCart core" group: the module knows the file lists of every OpenCart release from 2.0.0.0 to 4.1.0.4 and tells core files from added ones. Such findings mean the core was edited by hand or this OpenCart version is older than the PHP you need. For example, for OpenCart 2.3.0.2 the PHP 8.3 report says "OpenCart core files: Will break". Then the answer is to upgrade OpenCart.
Does it check encoded (ionCube) modules too?
Nobody but its author can read an encoded file. The module finds such files — ionCube, SourceGuardian, Zend Guard, obfuscated eval(base64_decode(…)) — and gives them the verdict "Encoded, cannot check": ask the vendor whether that build runs on the new PHP. The Overview shows whether the server has the ionCube Loader: the host has to install it for the new PHP version too.
How long does a scan take, and will it bring the server down?
A test OpenCart 4.1.0.3 with a few extensions has about 5,300 PHP files. On a test shop with 60,836 files (memory_limit 128M, local stand) the scan took 180 seconds — 30 steps of up to 6 seconds each, so it does not hit max_execution_time. The overview and the report open in a tenth of a second after it. You can stop a scan. Above 80,000 files the module stops listing and says so — exclude data folders in the settings.
Will the module tell me what to ask the host for?
Yes. The Overview shows the PHP version of the server and its support status by the php.net dates, the newest release of your line (php.net is asked only on a button click), the PHP extensions OpenCart needs, the ionCube Loader, memory_limit and max_execution_time. PHP extensions are switched on per PHP version, so they have to be enabled again for the new one. Functions from extensions the new PHP no longer ships (mcrypt, imap and others) are marked "Needs extension" in the report.
Does the module run on the old PHP I am moving away from?
Yes. The OpenCart 3.x and 2.3 builds run on PHP 5.6 and newer, the OpenCart 4 build on the same PHP as OpenCart 4 itself (8.0+). We tested on PHP 5.6, 7.0, 8.1, 8.3 and 8.5. So you install the module on your current PHP and get the verdict for the future one.
Is the licence yearly?
No. For OpenCart it is one payment, a lifetime licence, and one licence covers all three builds: 4.x, 3.x and 2.3. The scan, the verdicts and all findings are in the free version with no time limit. The 7-day Pro trial starts with a button in Settings → Licence; it never starts by itself.
What is left after the module is removed?
Uninstalling removes the menu event and the module tables with scan results — there is no shop data in them. The licence rows stay on purpose, so a reinstall keeps the purchase or the used trial.
No reviews yet. Be the first.
No questions yet. Ask one — we answer within 24 hours.
Not quite what you are looking for?
We build custom modules for WordPress, WooCommerce, OpenCart and Shopify. Tell us about the task and we'll prepare an estimate.
Order a custom module
Buying the module
—
