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

时间:2016-01-17 19:23:52

标签: php ubuntu curl

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

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

编辑: 当我尝试

php -i | grep curl       
在终端

,它返回

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

10 个答案:

答案 0 :(得分:80)

升级到XX(16.04)后,我的卷曲问题也有类似问题。 重新安装curl后:

sudo apt-get install php-curl

服务器重启

sudo service apache2 restart

一切都恢复正常:)

答案 1 :(得分:15)

<强>假设

您已经为您正在使用的PHP版本安装了该模块的版本,但问题并没有消失。

  

这里发生了什么?

您的系统上可能安装了多个版本的PHP,并且Apache没有使用您期望它使用的版本。

  

您如何知道哪个版本的PHP 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 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正在使用的配置的位置,现在我可以通过检查"mods-enabled"目录中的"/etc/apache2"目录来准确地确定它正在使用的PHP版本。

就我而言,在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 -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版本对应的模块版本(在我的示例中为php5.0-curl),也可以更改Apache中使用的PHP版本到你想要的版本。

  

如何告诉Apache使用哪个版本的PHP?

您可以使用Apache2的a2enmod/a2dismod cli命令完成此操作。

首先,我禁用我服务器上当前处于活动状态的PHP模块(即"php5"):

a2dismod php5

然后我启用php模块以获取我希望我的Apache使用的PHP版本:

a2enmod php5.6

然后我重启Apache

service apache2 restart

在我刷新网站上的违规页面后,错误现在消失了。

答案 2 :(得分: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

答案 3 :(得分:3)

对我来说,解决方法是使用以下命令更新apt-get,然后安装php7.0-curl。

sudo add-apt-repository ppa:ondrej/php

答案 4 :(得分:2)

我完成了上述所有操作,但没有解决问题。

环境: Ubuntu,php7.1,Laravel 5.6

解决方案

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

答案 5 :(得分:1)

您的页面可能不是使用CLI SAPI生成的。检查从网络服务器运行时phpinfo()返回的内容(它可能尝试读取错误的ini文件)。

答案 6 :(得分:1)

我知道它的答案很晚,但是我认为它很有用,因为我遇到了同样的问题,并尝试了上述所有解决方案,但没有用。 然后我按以下命令,现在可以正常工作了:

apt-get install php7.0-curl

答案 7 :(得分:0)

  • 第1步:下载Php 7,
  • 第2步:复制libeay32.dll和ssleay32.dll并在C:\ Windows \ System32中将它们过去。
  • 步骤3:用最新的dll替换C:\ php \ ext中的php_openssl.dll和php_curl.dll。 重启apache

这解决了我的问题,希望有人受益

答案 8 :(得分:0)

ubuntu 18.04 php 7.4

如果您具有PHP的旧版本和新版本。您需要禁用旧的卷曲模式,这样。 遵循步骤。

sudo a2dismod php7.1 (your old version) sudo a2endmod php7.4 (your new version) sudo service apache2 restart sudo systemctl restart apache2

对我有用。

答案 9 :(得分:0)

在这上面抓了一段时间,虽然curl模块已加载,但仍然出现错误。
当我从Debian Stretch升级到Buster之后,就会发生这种情况。

原因是安装并使用了php7.3-curl,但是即使安装了7.3,apache仍运行php7.0。 所以我删除了php7.0并重新安装了libapache2以使其正常工作

apt-get remove php-7.0
apt-get remove libapache2-mod-php7.3
apt-get install libapache2-mod-php7.3