Вызовите функцию undefined 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

Ответ 1

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

sudo apt-get install php-curl

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

sudo service apache2 restart

все нормализовалось:)

Ответ 2

предположение

Вы установили версию модуля для используемой версии PHP, но проблема не исчезла.

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

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

Как узнать, какая версия PHP Apache используется?

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

apache2ctl -V  //sample output below

AH00558: apache2: Could not reliably determine the server 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 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"

В моем случае мой каталог конфигурации Apache ROOT отображается в

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 использует версию PHP 'php5' установленную в моей системе, какой бы она ни была.

Затем я попытался воспроизвести ошибку выше, используя эту версию PHP (то есть '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" к указанной ошибке.

Решение

Чтобы решить эту проблему, вы должны либо установить версию модуля, соответствующую версии PHP, которую использует Apache (в моем примере php5.0-curl), либо вы можете изменить версию PHP, которая используется в Apache, на версию ты хочешь.

Как мне сказать Apache, какую версию PHP использовать?

Вы можете сделать это с помощью a2enmod/a2dismod cli Apache2.

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

a2dismod php5

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

a2enmod php5.6

Затем я перезагружаю Apache

service apache2 restart

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

Ответ 3

Возможно, ваш путь к файлу неправильный

Проверьте журнал ошибок 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

Ответ 4

Для меня было принято решение обновить apt-get следующей командой, а затем установить php7.0-curl.

sudo add-apt-repository ppa:ondrej/php

Ответ 5

Я сделал все вышеперечисленное, но не решил проблему.

Конверт: Ubuntu, php7.1, Laravel 5.6

Решение

sudo add-apt-repository ppa:ondrej/php
sudo apt-get install php7.1-curl

Ответ 6

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

Ответ 7

Я знаю очень поздний ответ, но думаю, что он полезен, потому что я столкнулся с той же проблемой и пробовал все вышеизложенное, но не сработало. Затем я нажал следующую команду и теперь работает отлично:

apt-get install php7.0-curl

Ответ 8

  • Шаг 1: Загрузите Php 7,
  • Шаг 2: скопируйте libeay32.dll и ssleay32.dll и вставьте их в C:\Windows\System32.
  • Шаг 3: Замените php_openssl.dll и php_curl.dll в C:\php\ext последней DLL. перезапустить Apache

Это решило мою проблему, надеюсь, кому-то тоже будет полезно