So sieht die Meldung aus
PHP Fatal error: Uncaught Error: Call to undefined function mysqli_connect() in /var/www/example.com/db.php:4
Stack trace:
#0 /var/www/example.com/index.php(2): require()Häufige Ursachen
- Das Paket mit den MySQL-Erweiterungen (
php-mysql) ist nicht installiert. - Es wurde für eine andere PHP-Version installiert als die, die die Seite ausliefert, zum Beispiel nach einem Upgrade mit mehreren Versionen nebeneinander.
- Die Erweiterung ist installiert, aber in den
conf.dder FPM-Konfiguration deaktiviert. - PHP-FPM wurde nach der Installation nicht neu gestartet, die laufenden Worker haben das Modul noch nicht.
- In einem Container wurde die Erweiterung nie ins Image gebaut.
Prüfen
- Kennt das CLI-PHP mysqli?
php -m | grep -i mysql - Welche PHP-MySQL-Pakete sind installiert?
dpkg -l | grep -E '^ii +php[0-9.]*-mysql' - Listet jede installierte PHP-FPM-Binärdatei mysqli? (das nutzt die Seite)
for f in /usr/sbin/php-fpm*; do echo "$f"; $f -m | grep -i mysqli; done - Ist sie in der FPM-Konfiguration aktiviert?
ls -l /etc/php/*/fpm/conf.d/ | grep -i mysql
Lösung
- Die Erweiterung für die genutzte Version installieren:
apt install php-mysql, oderphp8.x-mysqlmit dem genauen Versionsnamen deines FPM. - Bei Bedarf aktivieren:
phpenmod mysqli. - Den PHP-FPM-Dienst dieser Version neu starten, damit die Worker das Modul laden.
- Mit der PHP-FPM-Binärdatei dieser Version erneut prüfen:
php-fpm8.x -m | grep mysqli. - In einem Docker-Image
docker-php-ext-install mysqliins Dockerfile aufnehmen und neu bauen.
Häufige Fragen
Warum klappt es auf der Kommandozeile, aber nicht im Browser?
CLI und PHP-FPM nutzen unterschiedliche Konfigurationen und können sogar verschiedene PHP-Versionen sein. Teste mit der PHP-FPM-Binärdatei, nicht nur mit php -m.
Steckt dieselbe Ursache hinter Class mysqli not found?
Ja. Beide Meldungen kommen von der fehlenden mysqli-Erweiterung. Bei PDO gilt dasselbe: could not find driver heißt, dass pdo_mysql fehlt, das dasselbe Paket mitbringt.