ionCube loader mismatch after a CWP PHP rebuild
After rebuilding the system PHP (/usr/local/bin/php), CWP installs the new engine but regenerates /usr/local/php/php.d/ioncube.ini pointing at the 8.2 loader regardless of the version it just built. On an 8.3 engine the loader refuses to initialize and php -v returns an empty string (while php -n -v prints the version normally).
That empty string breaks the panel: the PHP Version Switcher shows a blank "currently running PHP version" box and the version dropdown falls back to the first catalog entry (5.3.29). The client-area PHP Selector then divides that empty value and dies with Uncaught TypeError: Unsupported operand types: string / int in PHPSelector->changeDomain(), so every save returns HTTP 500 with a 5-byte body which looks like a hung page, not an error.
Fix point the loaders at the engine actually installed, and drop extensions that have no build for it:
sed -i 's|ioncube_loader_lin_8.2.so|ioncube_loader_lin_8.3.so|' /usr/local/php/php.d/ioncube.ini
# only if SourceGuardian is declared:
cp -p /usr/local/src/sgloaders/ixed.8.3.lin /usr/local/sourceguardian/
sed -i 's|ixed.8.2.lin|ixed.8.3.lin|' /usr/local/php/php.d/sourceguardian.ini
# extensions with no .so for the new API (oauth) or built against the old one (uploadprogress):
sed -i -E 's/^extension=(imagick|oauth)\.so/;&/' /usr/local/bin/php.ini
mv /usr/local/php/php.d/uploadprogress.ini /usr/local/php/php.d/uploadprogress.ini.disabled
# verify must print the version and report zero warnings:
php -v | head -1
php -r 'echo 1;' 2>&1 | grep -cE 'Warning|Error|Cannot|requires' # expect 0
The goal is zero output noise: any warning printed before the version string reproduces the same failure, since the panel parses that output. Reproduced independently on two servers (AlmaLinux 8.10, CWP 1.26, panel on PHP 8.3.36). Note that every future rebuild rewrites those .ini files back to 8.2, so they need rechecking after each one.