Chiama alla function non definita curl_init () anche se è abilitato in php7

Ho appena installato php7 sul mio Ubuntu. All'inizio non c'erano problemi, il mio sito web funzionava. Ma improvvisamente, ha iniziato a restituire l'errore Call to andefined function curl_init (). Ora, le mie pagine contengono codici di arricciatura non funzionano.

In phpinfo (), sembra che Curl sia abilitato. C'erano domande simili ma nessuno di loro lo ha gestito in php7. Ho pensato che dovrebbe essere qualcosa di diverso dagli altri.

Modifica: quando ci provo

php -i | grep curl 

nel terminal, ritorna

 /etc/php/7.0/cli/conf.d/20-curl.ini, curl 

Ho avuto un problema simile con curl dopo l'aggiornamento a XX (16.04). Dopo aver reinstallato l'arricciatura con:

 sudo apt-get install php-curl 

E il riavvio del server

 sudo service apache2 restart 

tutto è tornato alla normalità 🙂

Che cosa sta succedendo qui?

Nel sistema potrebbero essere installate più versioni di PhP e Apache non sta utilizzando la versione che si prevede utilizzi.

Come fai a sapere quale versione di PhP Apache sta usando?

Per saperlo, l'idea chiave è di imparare la directory ROOT dei file di configuration di Apache. Nella row di command, puoi digitare:

 apache2ctl -V //sample output below AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message Server version: Apache/2.4.7 (Ubuntu) Server built: Jul 15 2016 15:34:04 Server's Module Magic Number: 20120211:27 Server loaded: APR 1.5.1-dev, APR-UTIL 1.5.3 Compiled using: APR 1.5.1-dev, APR-UTIL 1.5.3 Architecture: 64-bit Server MPM: prefork threaded: no forked: yes (variable process count) Server compiled with.... -D APR_HAS_SENDFILE -D APR_HAS_MMAP -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled) -D APR_USE_SYSVSEM_SERIALIZE -D APR_USE_PTHREAD_SERIALIZE -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT -D APR_HAS_OTHER_CHILD -D AP_HAVE_RELIABLE_PIPED_LOGS -D DYNAMIC_MODULE_LIMIT=256 -D HTTPD_ROOT="/etc/apache2" -D SUEXEC_BIN="/usr/lib/apache2/suexec" -D DEFAULT_PIDLOG="/var/run/apache2.pid" -D DEFAULT_SCOREBOARD="logs/apache_runtime_status" -D DEFAULT_ERRORLOG="logs/error_log" -D AP_TYPES_CONFIG_FILE="mime.types" -D SERVER_CONFIG_FILE="apache2.conf" 

Nel mio caso, la directory di configuration ROOT di Apache è mostrata nel

 HTTPD_ROOT="/etc/apache2" 

Ora che conosco la posizione delle configurazioni che Apache sta usando, ora posso determinare con precisione la versione di PhP che sta usando esaminando la directory "mods-enabled" trova all'interno della directory "/etc/apache2" .

Nel mio caso, quando si esegue un ls mentre si è all'interno di "mods-enabled" , viene mostrato l'output ff:

 access_compat.load authz_user.load filter.load php5.load ... authz_host.load env.load php5.conf 

A questo punto, sono stato in grado di sapere con certezza che Apache stava usando la versione 'php5' di PhP installata nel mio sistema, qualunque cosa fosse.

Poi ho provato a riprodurre l'errore del codice sopra usando questa versione di PhP (cioè, 'php5' ) eseguendo il command seguente:

 $ php5 -r "curl_init();" PHP Fatal error: Call to undefined function curl_init() in Command line code on line 1 

Ecco!

La versione di Php che stavo aspettando che il mio Apache stia usando è "php5.6" e l'esecuzione dello stesso command sopra con questa versione non ha prodotto il suddetto errore.

Come posso comunicare ad Apache quale versione di PhP usare?

Nel mio caso, ho usato i comandi cli a2enmod/a2dismod di Apache2.

Innanzitutto, disabilito il module php che è attualmente attivo sul mio server (cioè "php5" ):

 a2dismod php5 

Quindi ho abilitato il module php per la versione di Php che voglio usare con Apache:

 a2enmod php5.6 

Quindi riavvio Apache

 service apache2 restart 

Dopo aver aggiornato la pagina offensiva nel mio sito Web, ora l'errore è scomparso.

Il tuo Filepath è probabilmente errato

Controlla il log degli errori di Apache

 /var/log/apache2/error.log 

se il path o il nome file chiamati corrispondono al tuo path reale, ad es

 /usr/lib/php/20151012/php_curl.so 

Nel mio caso è stato lo stesso path, ma mancava "il php_"

 /usr/lib/php/20151012/curl.so 

Così ho cambiato il path / nome del file in

 /etc/php/7.0/cli/conf.d/20-curl.ini 

a partire dal

 extension=php_curl.so 

in

 extension=curl.so 

Le tue pagine probabilmente non sono generate con la SAPI della CLI. Controlla cosa restituisce phpinfo () quando viene eseguito dal tuo server web (probabilmente sta cercando di leggere il file ini sbagliato).