Hi
@Sebahat.hadzhi,
We found the root cause and a workaround:
The Joomla Toolkit executes internal CLI commands (e.g. "site:list") using a PHP binary. In our case, it picked up "/usr/local/php85/bin/php" (PHP 8.5) — a custom-built PHP version compiled by us and registered as a PHP handler. However, the affected domain was configured to use
PHP 8.3 shipped by Plesk, and our PHP 8.5 was
intentionally disabled for the tests. The toolkit appears to simply select the newest PHP version on the system regardless of the domain's setting or whether that version is enabled:
Code:
$ plesk bin php_handler --list | grep php85
php85-fastcgi-nc 8.5 8.5.0 8.5 fastcgi /usr/local/php85/bin/php-cgi /usr/local/php85/bin/php /etc/php/8.2/fpm/php.ini true disabled
The bundled Symfony Console and Joomlatools Console use implicit nullable parameters, which emit
Deprecated warnings to stdout on PHP 8.4+. This can be seen when enabling the debug mode of Plesk and running
Code:
plesk ext joomla-toolkit --instances-scan
These warnings are printed
before the JSON output the toolkit expects to parse, causing a JSON parse failure (
Syntax error) that surfaces as
Cannot access offset of type string on string — both in CLI and in the Plesk UI (
UiLibrary.php:79).
Debug log showing the toolkit invoking PHP 8.5 despite the domain being set to PHP 8.3:
Code:
[2026-03-13 17:51:59.127] DEBUG [extension/joomla-toolkit] Starting: '/opt/psa/admin/bin/filemng' 'tester.test_iko228qu5ib' 'exec' '/var/www/vhosts/tester.test/httpdocs' '/usr/local/php85/bin/php' '-d' 'open_basedir=' '-d' 'memory_limit=256M' '/opt/psa/admin/plib/modules/joomla-toolkit/vendor/joomlatools/console/bin/joomla' 'site:list' '--www=/var/www/vhosts/tester.test' '--config'
Deprecation warnings polluting stdout before the JSON output:
Code:
Deprecated: Joomlatools\Console\Application::run(): Implicitly marking parameter $input as nullable is deprecated, the explicit nullable type must be used instead in /opt/psa/admin/plib/modules/joomla-toolkit/vendor/joomlatools/console/src/Joomlatools/Console/Application.php on line 71
Deprecated: PleskJoomlaToolkit\Symfony\Component\Console\Application::run(): Implicitly marking parameter $input as nullable is deprecated, the explicit nullable type must be used instead in /opt/psa/admin/plib/modules/joomla-toolkit/vendor/symfony/console/Application.php on line 98
... (dozens more deprecation warnings) ...
{"command":"site:list","data":{"/var/www/vhosts/tester.test/httpdocs":{...}}}
Resulting parse failure:
Code:
[2026-03-13 17:51:59.245] ERR [extension/joomla-toolkit] Syntax error
Which then causes the UI error:
Code:
[2026-03-13 17:55:26.391] ERR [panel] Cannot access offset of type string on string:
0: /opt/psa/admin/plib/modules/joomla-toolkit/library/UiLibrary.php:79
PleskExt\JoomlaToolkit\UiLibrary::getInstanceData(integer '1')
1: /opt/psa/admin/plib/modules/joomla-toolkit/library/UiLibrary.php:25
PleskExt\JoomlaToolkit\UiLibrary::getListData(string '', integer '1', integer '5')
2: /opt/psa/admin/plib/modules/joomla-toolkit/controllers/IndexController.php:33
IndexController->indexAction()
Workaround
- Set
error_reporting = E_ALL & ~E_DEPRECATED in the php.ini of the PHP version the toolkit actually uses (in our case /usr/local/php85/etc/conf.d/disable_deprecated_output.ini).
- Uninstall and reinstall the Joomla Toolkit extension, then re-scan.
Additional bug found
While analysing this issue, another bug was found: It currently seems that the Joomla Toolkit allows the installation of the current Joomla version on PHP versions that are too old (lower than 8.3). The Toolkit should prevent installing Joomla on domains with a too old PHP version activated. It seems that when the very first install of Joomla on a server using the Toolkit is done on a domain with a PHP version that is too old, it can permanently break the toolkit with the same "Cannot access offset of type string on string" error. In this case, the issue can be resolved by uninstalling the extension and reinstalling it, then, broken instances are marked as "broken" when listing them via the CLI (as they should be).
Suggestions for the Development Team
1. Suppress deprecation output in internal CLI calls. The toolkit already passes
-d open_basedir= and
-d memory_limit=256M when invoking PHP. Adding
-d error_reporting=E_ALL&~E_DEPRECATED (or
-d display_errors=Off) would prevent warnings from polluting the JSON output regardless of PHP version — the most straightforward fix.
2. Respect the domain's configured PHP version — or pin to a Plesk-shipped binary. The toolkit selecting the newest registered PHP version, even when disabled, is unexpected and problematic. It should either use the domain's configured PHP handler, or use a known-compatible version shipped by Plesk.
3. Do not allow installation of Joomla on domains with too old PHP version. (Currently older than 8.3).
Note: The uninstall error (
Site without PhysicalHosting cannot be Webspace) appears to be a separate issue only occurring on uninstalls and does not seem to cause issues otherwise.