Website-Suche

PHP OPcache auf Rocky/Alma/CentOS 9|8 installieren


Der OPcache soll die Leistung von PHP verbessern, indem vorkompilierter Skript-Bytecode im gemeinsamen Speicher abgelegt wird. Durch das Caching von PHP-Skripten im Speicher entfällt die Notwendigkeit für PHP, die Skripte bei jeder eingehenden Anfrage zu laden und zu parsen. Beim Hosting von Websites oder Webanwendungen, die in PHP entwickelt wurden, wird die Nutzung von OPcache die Reaktionsgeschwindigkeit und die allgemeinen Ladezeiten erheblich verbessern.

So funktioniert PHP OPcache:

  1. Script-Kompilierung: OPcache kompiliert ein angefordertes Skript in Bytecode.
  2. Bytecode-Caching: Sobald der Bytecode kompiliert ist, wird er im gemeinsamen Speicher abgelegt, um schnelleren Zugriff zu ermöglichen.
  3. Ausführung nachfolgender Anfragen: Beim nächsten Empfang einer Anfrage für dasselbe Skript wird der zwischengespeicherte Bytecode verwendet, wodurch der Kompilierungsschritt umgangen wird und die Ausführung schneller erfolgt.

Zusammenfassend lässt sich sagen, dass Sie durch die Verwendung von OPcache schnellere Ausführungszeiten von PHP-Skripten, eine geringere Belastung von CPU und Speicher sowie eine bessere Systemskalierbarkeit erleben werden, da es mehr gleichzeitige Anfragen bewältigen kann.

Wie können Sie also PHP OPcache auf einem Rocky Linux/AlmaLinux und CentOS Stream 9|8 Linux-System installieren und konfigurieren? Folgen Sie dieser Anleitung, um zu erfahren, wie es geht.

Wechseln Sie von REMI zur PHP-Version

Wir können OPcache nur auf einem System mit installiertem PHP aktivieren. Die genannten Systeme stellen mehrere PHP-Versionen in den AppStream-Repositories bereit. Aber Opcache wird in den REMI-Repositories bereitgestellt.

Um zu überprüfen, ob PHP installiert ist, führen Sie den Befehl aus:

$ php --version
PHP 8.2.13 (cli) (built: Nov 21 2023 09:55:59) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.2.13, Copyright (c) Zend Technologies

Von meinem System aus können wir bestätigen, dass die Version 8.2 ist. Also können wir das PHP-Modul zurücksetzen.

sudo dnf module reset php -y

Als Nächstes installieren wir Remis RPM-Repository:

  • Enterprise Linux 9 – (Rocky/Alma/CentoS Stream 9)
sudo dnf -y install https://rpms.remirepo.net/enterprise/remi-release-9.rpm
  • Enterprise Linux 8 – (Rocky/Alma/CentOS Stream 8)
sudo dnf -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm

Der Installer richtet das EPEL-Repository automatisch als Abhängigkeit ein. Um zu überprüfen, ob REMI funktioniert, führen Sie aus:

$ sudo dnf -y repolist
repo id                                                                                 repo name
appstream                                                                               Rocky Linux 8 - AppStream
baseos                                                                                  Rocky Linux 8 - BaseOS
epel                                                                                    Extra Packages for Enterprise Linux 8 - x86_64
extras                                                                                  Rocky Linux 8 - Extras
remi-modular                                                                            Remi's Modular repository for Enterprise Linux 8 - x86_64
remi-safe                                                                               Safe Remi's RPM repository for Enterprise Linux 8 - x86_64

Alle PHP-Module können überprüft werden, indem der folgende Befehl ausgeführt wird:

 dnf module list php

Hier ist die Beispielausgabe:

Rocky Linux 8 - AppStream
Name                                        Stream                                              Profiles                                                          Summary
php                                         7.2 [d][x]                                          common [d], devel, minimal                                        PHP scripting language
php                                         7.3 [x]                                             common [d], devel, minimal                                        PHP scripting language
php                                         7.4 [x]                                             common [d], devel, minimal                                        PHP scripting language
php                                         8.0 [x]                                             common [d], devel, minimal                                        PHP scripting language
php                                         8.2 [x]                                             common [d], devel, minimal                                        PHP scripting language

Remi's Modular repository for Enterprise Linux 8 - x86_64
Name                                        Stream                                              Profiles                                                          Summary
php                                         remi-7.2 [x]                                        common [d], devel, minimal                                        PHP scripting language
php                                         remi-7.3 [x]                                        common [d], devel, minimal                                        PHP scripting language
php                                         remi-7.4 [x]                                        common [d], devel, minimal                                        PHP scripting language
php                                         remi-8.0 [x]                                        common [d], devel, minimal                                        PHP scripting language
php                                         remi-8.1 [x]                                        common [d], devel, minimal                                        PHP scripting language
php                                         remi-8.2 [x]                                        common [d], devel, minimal                                        PHP scripting language
php                                         remi-8.3 [x]                                        common [d], devel, minimal                                        PHP scripting language

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled

Aktivieren Sie nun ein bestimmtes PHP-Modul von REMI. Aus den vorherigen Ausgaben geht hervor, dass PHP in der Version 8.2 installiert wurde, was bedeutet, dass wir das Modul php:remi-8.2 aktivieren sollten.

sudo dnf module install php:remi-8.2 -y

In den meisten Fällen wird es Ihre installierte PHP-Version aktualisieren und die Pakete nicht deinstallieren.

Dependencies resolved.
==============================================================================================================================================================================================================================
 Package                                               Architecture                                   Version                                                      Repository                                            Size
==============================================================================================================================================================================================================================
Upgrading:
 php-cli                                               x86_64                                         8.2.21-1.el8.remi                                            remi-modular                                         5.5 M
 php-common                                            x86_64                                         8.2.21-1.el8.remi                                            remi-modular                                         1.3 M
 php-fpm                                               x86_64                                         8.2.21-1.el8.remi                                            remi-modular                                         1.9 M
 php-mbstring                                          x86_64                                         8.2.21-1.el8.remi                                            remi-modular                                         583 k
 php-xml                                               x86_64                                         8.2.21-1.el8.remi                                            remi-modular                                         264 k
Installing dependencies:
 oniguruma5php                                         x86_64                                         6.9.9-1.el8.remi                                             remi-safe                                            213 k
Installing module profiles:
 php/common
Enabling module streams:
 php                                                                                                  remi-8.2

Transaction Summary
==============================================================================================================================================================================================================================
Install  1 Package
Upgrade  5 Packages

Total download size: 9.7 M
Is this ok [y/N]: y

PHP OPcache installieren

Mit dem konfigurierten REMI-RPM-Repository können wir nach verfügbaren Versionen von OPcache suchen.

$ sudo dnf search opcache
Last metadata expiration check: 0:07:55 ago on Sun 28 Jul 2024 10:12:13 PM UTC.
============================================================================================== Name & Summary Matched: opcache ===============================================================================================
php-opcache.x86_64 : The Zend OPcache
php56-php-opcache.x86_64 : The Zend OPcache
php70-php-opcache.x86_64 : The Zend OPcache
php71-php-opcache.x86_64 : The Zend OPcache
php72-php-opcache.x86_64 : The Zend OPcache
php73-php-opcache.x86_64 : The Zend OPcache
php74-php-opcache.x86_64 : The Zend OPcache
php80-php-opcache.x86_64 : The Zend OPcache
php81-php-opcache.x86_64 : The Zend OPcache
php82-php-opcache.x86_64 : The Zend OPcache
php83-php-opcache.x86_64 : The Zend OPcache
php84-php-opcache.x86_64 : The Zend OPcache

In diesem Beispiel installieren wir php82-php-opcache, das spezifisch für die PHP-Version 8.2 ist. Ändern Sie dies auf eine Version, die zu Ihrer installierten PHP-Version passt.

sudo dnf install php82-php-opcache

Weitere Informationen über das installierte Paket können mit den rpm -qi-Befehlen abgefragt werden:

$ rpm -qi php82-php-opcache
Name        : php82-php-opcache
Version     : 8.2.21
Release     : 1.el8.remi
Architecture: x86_64
Install Date: Sun 28 Jul 2024 10:21:52 PM UTC
Group       : Unspecified
Size        : 1024035
License     : PHP-3.01
Signature   : RSA/SHA256, Tue 02 Jul 2024 02:07:23 PM UTC, Key ID 555097595f11735a
Source RPM  : php82-php-8.2.21-1.el8.remi.src.rpm
Build Date  : Tue 02 Jul 2024 01:33:41 PM UTC
Build Host  : builder.remirepo.net
Relocations : (not relocatable)
Packager    : Remi Collet
Vendor      : Remi's RPM repository <https://rpms.remirepo.net/> #StandWithUkraine
URL         : http://www.php.net/
Bug URL     : https://forum.remirepo.net/
Summary     : The Zend OPcache
...

PHP OPcache konfigurieren

Verwenden Sie den Befehl find, um den Pfad des OPcache-Moduls zu finden.

$ sudo find / -name opcache.so
/usr/lib64/php/modules/opcache.so
/usr/lib64/php-zts/modules/opcache.so

Das Modul sollte bei der Installation automatisch geladen werden.

$ php -m  | grep -i opcache
Zend OPcache
Zend OPcache

Der Installer erstellt außerdem eine Konfigurationsvorlage in /etc/php.d, die Sie anpassen können.

$ ls /etc/php.d/|grep opcache
10-opcache.ini
opcache-default.blacklist

Öffnen Sie die Datei zur Bearbeitung.

sudo vi /etc/php.d/10-opcache.ini

Auf unserem Server verwenden wir die folgenden Einstellungen, um eine gute Leistung zu gewährleisten:

; Enable Zend OPcache extension module
zend_extension=opcache

; Determines if Zend OPCache is enabled
opcache.enable=1

; Determines if Zend OPCache is enabled for the CLI version of PHP
opcache.enable_cli=1

; The OPcache shared memory storage size (in MB)
opcache.memory_consumption=512

; The amount of memory for interned strings in Mbytes.
opcache.interned_strings_buffer=128

; The maximum number of keys (scripts) in the OPcache hash table.
opcache.max_accelerated_files=10000

; The maximum percentage of "wasted" memory until a restart is scheduled.
opcache.max_wasted_percentage=5

; Enable timestamp validation, ensuring that cached files are up to date.
opcache.validate_timestamps=1

; Checks for script changes every 2 seconds.
opcache.revalidate_freq=2

; Path where OPcache can store file cache.
opcache.file_cache=/tmp

; Enables or disables opcode caching in shared memory.
opcache.file_cache_only=0

; Enables or disables checksum validation when script loaded from file cache.
opcache.file_cache_consistency_checks=1

; Other performance settings
opcache.fast_shutdown=1
opcache.enable_file_override=1
opcache.optimization_level=0x7FFFBFFF

Beziehen Sie sich auf die offizielle OPcache-Dokumentation für eine vollständige Liste der Optionen, die Sie konfigurieren und anpassen können.

Testen, ob OPcache funktioniert

Starten Sie Ihren Webserver und die php-fpm-Dienste neu.

  • Nginx-Webserver
sudo systemctl restart php-fpm nginx
  • Apache httpd Webserver
sudo systemctl restart php-fpm httpd

Die Auflistung der OPcache-Laufzeitkonfigurationen kann durch Ausführen der folgenden Befehle erfolgen:

php -i | grep opcache

Erstellen Sie ein Beispiel-PHP-Skript, um zu testen, ob OPcache in unserem System funktioniert.

  • Nginx-Webserver
sudo vi /usr/share/nginx/html/opcache.php
  • Apache httpd Webserver
sudo vi /var/www/html/opcache.php

Fügen Sie den Inhalt in die Datei ein.

<?php
if (function_exists('opcache_get_status')) {
    $status = opcache_get_status();
    if ($status) {
        echo "OPcache is enabled on the server.";
    } else {
        echo "OPcache is disabled on the server..";
    }
} else {
    echo "OPcache is not installed.";
}
?>

Speichern Sie die Datei und öffnen Sie sie unter http://serverIP_or_fqdn/opcache.php

Dies bestätigt, dass PHP OPcache in unserem System einwandfrei funktioniert. Wir hoffen, dieser Artikel war hilfreich und wünschen Ihnen schnellere Ladezeiten für Ihre Website!