Why This Guide Exists
This walkthrough came out of a support ticket (TKT-MKGJMGFD) where a customer needed to run a third-party application that required the ionCube PHP Loader. The same steps are also posted as a forum thread for anyone who wants to discuss edge cases or report a problem with a specific application.
Panelica does not ship ionCube and does not have a one-click installer for it. If you need it, you install it manually. The process is straightforward, but the paths are different from what you may be used to on cPanel or Plesk, because Panelica builds its own PHP from source under /opt/panelica/services/php/<version>/ instead of relying on the distro's PHP packages.
Before You Start
ionCube is loaded per PHP version, not per site. A zend_extension is loaded when the PHP engine starts, not per pool, so there is no way to enable it for one domain and not another on the same PHP version. If you have several sites on PHP 8.3 and only one of them needs ionCube, all of them will have it loaded — this does not cause any harm to the other sites, it is simply how Zend extensions work.
The examples below use PHP 8.3. Replace 8.3 with whichever version your site actually runs.
Step 1: Download the Loader
Download the official Linux x86-64 loader package from ionCube directly on your server:
cd /tmp
curl -LO https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz
tar xzf ioncube_loaders_lin_x86-64.tar.gz
At the time of writing, this package contains ionCube Loader 15.5.1, with separate .so files for PHP 8.1, 8.2, 8.3, 8.4 and 8.5. Each version also has a _ts (thread-safe) variant — you will not need that one, explained below.
Step 2: Put the Loader File in Place
Copy the matching loader into your PHP installation. Panelica keeps each PHP version self-contained, so there is a clean place to put it:
mkdir -p /opt/panelica/services/php/8.3/ioncube
cp /tmp/ioncube/ioncube_loader_lin_8.3.so /opt/panelica/services/php/8.3/ioncube/
Use the plain ioncube_loader_lin_8.3.so file, not the _ts one. Panelica's PHP builds are non-thread-safe across the board — this was verified on PHP 8.1 through 8.5, all reporting Thread Safety => disabled. Loading the thread-safe variant against a non-thread-safe PHP build will not work. Architecture is x86_64, matching the PHP binaries Panelica builds.
Step 3: Create the Configuration File — and Get the Filename Right
This is the step that actually matters. Create a new .ini file in the PHP version's conf.d directory:
printf 'zend_extension=/opt/panelica/services/php/8.3/ioncube/ioncube_loader_lin_8.3.so\n' > /opt/panelica/services/php/8.3/etc/conf.d/00-ioncube.ini
The 00- prefix is required, for two separate reasons, both confirmed by testing:
- ionCube must be the first Zend extension loaded. PHP's
conf.dfiles are read in filename order. If the ionCube ini file loads after10-opcache.ini, PHP refuses to start at all, with:[ionCube Loader] The Loader must appear as the first entry in the php.ini file. This was reproduced on PHP 8.1, 8.2 and 8.4. PHP 8.5 happened to tolerate a later load order only because itsconf.ddoes not contain a10-opcache.inifile — it is not a safe assumption to rely on for other versions. Naming the file00-ioncube.iniloaded cleanly on 8.1, 8.3, 8.4 and 8.5. - It survives PHP package updates. When Panelica applies an update to a PHP package, it regenerates only the
conf.dfiles prefixed10-,15-and20-. Files prefixed00-are left untouched — this is the same convention Panelica already uses for00-cacert.ini, which ships in every PHP version. Naming your file00-ioncube.inimeans a future PHP update will not silently remove your ionCube configuration.
Step 4: Verify Without Touching Any Live Site
Before restarting anything that serves traffic, check the CLI binary directly:
/opt/panelica/services/php/8.3/bin/php -v
You should see a line like:
with the ionCube PHP Loader v15.5.1, Copyright (c) 2002-2026, by ionCube Ltd.
The CLI binary reads the exact same conf.d directory that PHP-FPM uses for every site on that version, so a wrong architecture, a thread-safe file in the wrong place, or a bad load order will show up here — before it has a chance to take any website down.
Step 5: Reload PHP
If there are no sites on this PHP version yet, a service restart is enough:
/opt/panelica/bin/pn-service restart php-8.3
If sites are already running, Panelica runs a separate PHP-FPM master process per user, so each of those needs to pick up the new configuration too:
systemctl list-units --plain --no-legend 'panelica-php-fpm-8.3-user@*' | awk '{print $1}' | xargs -r systemctl restart
Three Things Worth Knowing
- ionCube and OPcache coexist fine. Both showed up together in
php -moutput with no conflict. There is no reason to disable OPcache to run ionCube. - Panelica turns off the OPcache JIT automatically once ionCube is loaded, writing a
conf.d/99-panelica-jit.inifile to do it. This is intentional, not a bug: the JIT and ionCube are mutually exclusive, and PHP would otherwise print a warning on every single startup. There is no performance loss from this, because the JIT could never actually engage while ionCube was loaded in the first place. - ionCube applies to the whole PHP version, not to one site. As noted above, a
zend_extensionloads with the PHP engine itself, so there is no per-site toggle for it. This is standard PHP behavior, not something specific to Panelica.
Prefer Not to Do This Yourself?
If you would rather not handle this manually, open a support ticket with your server's SSH access and the PHP version the application needs — we will take care of the installation for you.
Discuss It
Questions about a specific application, an error message that does not match what is covered here, or anything else related to running ionCube-encoded PHP on Panelica — the forum thread for this guide is the place for it.