Da ich fast nirgends mehr sinnvolle Anleitungen zum kompilieren von PHP gefunden habe und die Optionen bei der Konfiguration bei jeder Version ändern habe ich beschlossen, den Vorgang zum kompilieren von PHP 8.1 hier mal festzuhalten.
Anmerkung: zum Zeitpunkt des Schreibens dieses Tutorials war die aktuelle PHP 8.1 Version 8.1.20

Ich habe PHP so kompiliert dass möglichst viele Anwendungen - aber vorallem Nextcloud - damit abgedeckt werden.
Ausserdem habe ich die PECL Module ebenfalls manuell kompiliert.
Dies kann man als Vorlage benutzen um weitere PECL Module zu installieren.

Zudem habe ich PHP so installiert dass es von Virtualmin zur individuellen Einstellung der PHP Version genutzt werden kann.

Links

PHP herunterladen

mkdir -p /opt/php/source
cd /opt/php/source
wget https://www.php.net/distributions/php-8.1.20.tar.gz
tar xvf php-8.1.20.tar.gz
cd  php-8.1.20

PHP konfigurieren

Da ich nicht weiss welche header-Dateien (dies sind die Pakete mit -devel am Ende) bereits auf dem System installiert sind und welche nicht, habe ich die hier nicht gelistet.
Während des Konfigrationsvorgangs wird configure dann schon meckern wenn ein header fehlt.
Dann muss man dieses Paket einfach installieren und configure erneut ausführen.
Dies macht man solange bis configure keine Fehler mehr ausspuckt.
Die Option --prefix= gibt an, in welches Verzeichnis PHP schlussendlich installiert wird.

./configure --prefix=/opt/php8.1.20 --with-config-file-scan-dir=/opt/php8.1.20/conf.d --enable-debug --disable-short-tags --with-libdir=lib64 --enable-bcmath --with-bz2 --enable-calendar --with-curl --enable-dba  --enable-exif --enable-ftp --enable-gd --with-gettext --with-gmp --with-iconv --with-imap --with-imap-ssl --enable-intl --with-ldap --with-ldap-sasl --enable-mbstring --with-mhash --with-mysqli --with-mysql-sock --enable-opcache --with-openssl --enable-pcntl --with-pdo-mysql --with-pdo-pgsql --with-pgsql --with-pear --enable-phar --enable-posix --with-pspell --with-readline --enable-shmop --with-snmp --enable-soap --enable-sockets --with-sodium --enable-sysvmsg --enable-sysvsem --enable-sysvshm --with-tidy --with-xsl --with-zip --with-zlib --with-freetype

PHP kompilieren und installieren

Mit den folgenden beiden Befehlen kompiliert und installiert PHP in das bei --prefix= angegebene Verzeichnis.
Das Kompilieren kann je nach Rechnerleistung ein paar Minuten dauern.

make
make install

Virtualmin

Damit die PHP Version von Virtualmin gefunden und genutzt werden kann, muss man folgendes Verszeichnis erstellen und dann einen Symlink auf die installierte PHP Version setzen.

mkdir -p /opt/rh/php81/root/usr
ln -s /opt/php8.1.20/bin /opt/rh/php81/root/usr/bin

Nun muss man noch die php.ini kopieren

cp /opt/php/source/php-8.1.20/php.ini-production /opt/php8.1.20/lib64/php.ini

Anschliessend sollte man die default Einstellungen der php.ini an die gewünschten Anforderungen anpassen.
Bei mir sind das z.b. Memory Limit oder auch execution time, etc.

Zum Schluss fügt man den Pfad /opt/php8.1.20/lib64/php.ini zur default php.ini im Server-Template ein welches man benutzen möchte um unterschiedliche PHP Versionen anzubieten.

PECL Module

Ich habe die PECL Module manuell installiert damit ich sicher gehen kann dass sie auch für die entsprechende PHP Version passen.
Ich installiere deshalb die Module im Verzeichnis /opt/php/pecl/8.1.

mkdir -p /opt/php/pecl/8.1

APCu

cd /opt/php/pecl/8.1
wget https://pecl.php.net/get/apcu-5.1.22.tgz
tar zxvf apcu-5.1.22.tgz
cd apcu-5.1.22
/opt/php8.1.20/bin/phpize
./configure --with-php-config=/opt/php8.1.20/bin/php-config
make
make install

memcached

cd /opt/php/pecl/8.1
wget https://pecl.php.net/get/memcached-3.2.0.tgz
tar zxvf memcached-3.2.0.tgz
cd memcached-3.2.0
/opt/php8.1.20/bin/phpize
./configure --with-php-config=/opt/php8.1.20/bin/php-config
make
make install

Imagick

cd /opt/php/pecl/8.1
wget https://pecl.php.net/get/imagick-3.7.0.tgz
tar zxvf imagick-3.7.0.tgz
cd imagick-3.7.0
/opt/php8.1.20/bin/phpize
./configure --with-php-config=/opt/php8.1.20/bin/php-config
make
make install

redis

cd /opt/php/pecl/8.1
wget https://pecl.php.net/get/redis-6.0.0.tgz
tar zxvf redis-6.0.0.tgz
cd redis-6.0.0
/opt/php8.1.20/bin/phpize
./configure --with-php-config=/opt/php8.1.20/bin/php-config
make
make install

PECL Module in PHP nutzen

Um die PECL Module in PHP zu nutzen muss man PHP sagen dass sie installiert sind.
Dies macht man über die php.ini.

Da ich diese Module global nutzen will, deklariere ich sie im Installations-Verzeichnis von PHP.
Vielleicht ist jemandem die configure option --with-config-file-scan-dir=/opt/php8.1.20conf.d aufgefallen?
Die bewirkt, dass PHP automatisch alle ini-Dateien in diesem Verzeichnis scannt (in alphabetischer Reihenfolge) und den Inhalt dieser Dateien in die Konfiguration lädt.

Auf diese Weise kann ich die PECL Module bzw. auch andere Konfigurationen integrieren, ohne die default php.ini zu verändern.

Also, zuerst erstelle ich mal das Verzeichnis:

mkdir -p /opt/php8.1.20/conf.d

Dann erstelle ich eine 00-PECLload.ini

nano /opt/php8.1.20/conf.d/00-PECLload.ini

mit folgendem Inhalt:

extension=apcu.so
extension=imagick.so
extension=memcached.so
extension=redis.so

Jetzt noch den Webserver neustarten und dann sollte PHP 8.1 einsatzbereit sein!

CLI

Ein kleiner Tip noch um diese PHP Version auch im CLI nutzen zu können:

export PATH=/opt/php8.1.20/bin:$PATH