调用未定义的函数curl_init(),即使它在php7中启用

我刚安装了php7到我的Ubuntu。 起初,没有问题,我的网站正在工作。 但突然,它开始返callback用未定义的函数curl_init()错误。 现在,我的页面包含curl代码不起作用。

在phpinfo()中,看起来Curl被启用。 有类似的问题,但没有一个在php7中处理它。 我认为这应该是别人不同的东西。

编辑:当我尝试

php -i | grep curl 

在terminal,它返回

 /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没有使用您期望使用的版本。

你怎么知道哪个版本的Apache Apache正在使用?

要知道这一点,关键的想法是学习Apache的配置文件的ROOT目录。 在命令行中,您可以输入:

 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 modulee 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正在使用的配置的位置,现在我可以通过检查位于"/etc/apache2"目录内的"/etc/apache2" "mods-enabled"目录来准确地确定它正在使用的PhP的版本。

在我的情况下,当在"mods-enabled"里面做ls时候,它显示了ff的输出:

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

此时,我可以确定地知道Apache正在使用安装在我的系统中的'php5'版本的PhP,无论如何。

然后,我试着通过运行下面的命令,使用这个版本的PhP(即'php5' )重现上面的代码的错误:

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

瞧!

我期待我的Apache使用的PHP的版本是"php5.6"和上面运行与此版本相同的命令并没有产生上述错误。

我如何告诉Apache哪个版本的PhP要使用?

在我的情况下,我使用了Apache2的a2enmod/a2dismod cli命令。

首先,我禁用当前处于活动状态的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生成的。 检查从你的web服务器(它可能试图读取错误的ini文件)运行时,phpinfo()返回什么。