Вызов неопределенной функции curl_init (), даже если он включен в php7

Я только что установил php7 для своего Ubuntu. Сначала не было проблем, мой веб-сайт работал. Но внезапно он начал возвращать Call to undefined function curl_init (). Теперь мои страницы содержат завитки, которые не работают.

В phpinfo () он выглядит как Curl. Были похожие вопросы, но ни один из них не обрабатывал его в php7. Я думал, что это должно быть чем-то другим, чем другие.

Изменить: Когда я пытаюсь

php -i | grep curl 

в терминале, он возвращает

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

У меня была аналогичная проблема с завихрением после обновления до XX (16.04). После переустановки с помощью:

 sudo apt-get install php-curl 

И перезагрузка сервера

 sudo service apache2 restart 

все вернулось к нормальной жизни 🙂

Что здесь происходит?

В вашей системе может быть несколько версий PhP, и Apache не использует версию, которую вы ожидаете использовать.

Откуда вы знаете, какая версия PhP Apache используется?

Чтобы это знать, основная идея – изучить каталог ROOT ваших конфигурационных файлов Apache. В командной строке вы можете ввести:

 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" 

В моем случае каталог конфигурации ROOT моего Apache показан в

 HTTPD_ROOT="/etc/apache2" 

Теперь, когда я знаю расположение конфигураций, которые использует Apache, теперь я могу точно определить версию PhP, которую он использует, изучая каталог с поддержкой "mods-enabled" расположенный в каталоге "/etc/apache2" .

В моем случае, когда вы делаете ls находясь внутри "mods-enabled" , он показывает ff-выход:

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

На данный момент я смог точно знать, что Apache использовал версию 'php5' PhP, установленную в моей системе, что бы это ни было.

Затем я попытался воспроизвести ошибку вышеприведенного кода, используя эту версию PhP (т. Е. «Php5 'php5' ), выполнив приведенную ниже команду:

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

Вуаля!

Версия Php, которую я ожидал от моего Apache, была "php5.6" и выполняла ту же самую команду с этой версией, которая не "php5.6" указанную ошибку.

Как сообщить Apache, какую версию PhP использовать?

В моем случае я использовал команды a2enmod/a2dismod для Apache2.

Во-первых, я отключу php-модуль, который в настоящий момент активен на моем сервере (т. "php5" ):

 a2dismod php5 

Затем я включил php-модуль для версии Php, я хочу, чтобы мой Apache использовал:

 a2enmod php5.6 

Затем я перезапускаю Apache

 service apache2 restart 

После того, как я обновил страницу с нарушением на моем веб-сайте, ошибка теперь исчезла.

Вероятно, ваш путь к файлу

Проверьте журнал ошибок Apache

 /var/log/apache2/error.log 

если вызываемый путь или имя файла соответствует вашему реальному пути, например

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

В моем случае это был тот же путь, но «php_» отсутствовал

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

Поэтому я изменил путь / имя файла в

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

из

 extension=php_curl.so 

в

 extension=curl.so 

Вероятно, ваши страницы не сгенерированы с помощью CLI SAPI. Проверьте, что возвращает phpinfo () при запуске с вашего веб-сервера (вероятно, он пытается прочитать неправильный файл ini).