Я только что установил 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).