Come appare il messaggio
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()Cause frequenti
- Il pacchetto con le estensioni MySQL (
php-mysql) non è installato. - È stato installato per una versione di PHP diversa da quella che serve il sito, per esempio dopo un upgrade con più versioni affiancate.
- L'estensione è installata ma disattivata nei
conf.ddella configurazione FPM. - PHP-FPM non è stato riavviato dopo l'installazione e i worker in esecuzione non hanno ancora il modulo.
- In un container l'estensione non è mai stata inclusa nell'immagine.
Verifica
- Il PHP da CLI conosce mysqli?
php -m | grep -i mysql - Quali pacchetti PHP-MySQL sono installati?
dpkg -l | grep -E '^ii +php[0-9.]*-mysql' - Ogni binario PHP-FPM installato elenca mysqli? (è quello che usa il sito)
for f in /usr/sbin/php-fpm*; do echo "$f"; $f -m | grep -i mysqli; done - È attiva nella configurazione FPM?
ls -l /etc/php/*/fpm/conf.d/ | grep -i mysql
Soluzione
- Installa l'estensione per la versione in uso:
apt install php-mysql, oppurephp8.x-mysqlcon il nome di versione esatto del tuo FPM. - Se serve, attivala:
phpenmod mysqli. - Riavvia il servizio PHP-FPM di quella versione così i worker caricano il modulo.
- Ricontrolla con il binario PHP-FPM di quella versione:
php-fpm8.x -m | grep mysqli. - In un'immagine Docker aggiungi
docker-php-ext-install mysqlial Dockerfile e ricostruisci.
Domande frequenti
Perché da riga di comando funziona e dal browser no?
CLI e PHP-FPM usano configurazioni diverse e possono anche essere versioni PHP diverse. Verifica con il binario PHP-FPM, non solo con php -m.
Class mysqli not found ha la stessa causa?
Sì. Entrambi i messaggi derivano dall'estensione mysqli mancante. Per PDO vale lo stesso: could not find driver significa che manca pdo_mysql, fornito dallo stesso pacchetto.