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

Posted

技术标签:

【中文标题】调用未定义的函数 curl_init() 即使它在 php7 中启用【英文标题】:Call to undefined function curl_init() even it is enabled in php7 【发布时间】:2016-04-22 21:47:27 【问题描述】:

我刚刚在我的 Ubuntu 上安装了 php7。 起初,没有问题,我的网站正在运行。 但是突然,它开始返回 Call to undefined function curl_init() 错误。 现在,我的页面包含 curl 代码不起作用。

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

编辑: 当我尝试

php -i | grep curl       

在终端,它返回

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

【问题讨论】:

【参考方案1】:

为此挠头了一会儿,curl 模块已加载,但仍然出现错误。 这发生在我从 Debian Stretch 升级到 Buster 之后。

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

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

【讨论】:

【参考方案2】:

ubuntu 18.04 php 7.4

如果你有PHP旧版本和新版本一样。您需要禁用旧的 curl 模式。 按照步骤操作。

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

它对我有用。

【讨论】:

【参考方案3】:

假设

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

这是怎么回事?

您的系统上可能安装了多个版本的 PHP,而 Apache 未使用您期望它使用的版本。

你怎么知道 Apache 使用的是哪个版本的 PHP?

要了解这一点,关键是要了解 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 正在使用的配置的位置,现在我可以通过检查位于 "/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 版本相对应的模块版本(在我的示例中为 php5.0-curl),或者您可以更改 Apache 中使用的 PHP 版本到你想要的版本。

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

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

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

a2dismod php5

然后我为我希望我的 Apache 使用的 PHP 版本启用了 php 模块:

a2enmod php5.6

然后我重新启动 Apache

service apache2 restart

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

【讨论】:

绝妙的一步一步的回答!非常感谢您的帮助。 np,很高兴您发现我的回答很有用。 这样的答案应该有更多的点,可以深入了解如何确定问题的根本原因。 对这个问题最有帮助的解决方案。【参考方案4】:

我做了以上所有但没有解决问题。

环境: Ubuntu、php7.1、Laravel 5.6

解决方案

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

【讨论】:

【参考方案5】:

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

apt-get install php7.0-curl

【讨论】:

@Records 我的荣幸 :)【参考方案6】:

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

sudo add-apt-repository ppa:ondrej/php

【讨论】:

【参考方案7】: 第 1 步:下载 PHP 7, 第 2 步:复制 libeay32.dll 和 ssleay32.dll 并将它们粘贴到 C:\Windows\System32 中。 第 3 步:将 C:\php\ext 中的 php_openssl.dll 和 php_curl.dll 替换为最新的 dll。 重启阿帕奇

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

【讨论】:

【参考方案8】:

升级到 XX (16.04) 后,我遇到了类似的 curl 问题。 重新安装 curl 后:

sudo apt-get install php-curl

然后服务器重启

sudo service apache2 restart

一切恢复正常:)

【讨论】:

上次从 Ubuntu 服务器 14.04 升级到 16.04 的过程并不顺利。由于配置文件中的一个不推荐使用的变量,mysql 陷入了困境,现在我发现 curl 被神奇地删除了,而且几天来我都不知道作业失败了。 仅供参考,就我而言,我运行的是 PHP 5.6 而不是默认的 7,所以apt-get install php-curl 给了我 7 版本.. 我不得不apt-get install php5.6-curl 对于某些人来说可以这样解决:sudo apt-get install php7.0-curl 找不到包 php-curl 对于我的情况,我必须安装 sudo apt-get install php7.2-curl 然后重新启动我的 apache 服务器【参考方案9】:

您的文件路径可能不正确

检查 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

【讨论】:

我认为获取 php 配置的最佳方法是使用 phpinfo() 运行 Web 脚本我得到了有关 curl 的所有信息,因为在这种情况下 curl 是为另一个版本的 php 配置的。 hth【参考方案10】:

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

【讨论】:

加载的配置文件是:/etc/php/7.0/apache2/php.ini 加载的配置目录是:/etc/php/7.0/apache2/conf.d 这些文件都OK了。 conf.d 文件夹中有一个 20-curl.ini 文件。那么,我做错了什么? 你是说通过 web sapi 它没有加载 /etc/php/7.0/apache2/conf.d/20-curl.ini 吗?建议您查看这些文件和 apache error_log。 在我的情况下 cli 是 php 7.1 而 apache 使用的是 7.0...我通过在 bash 配置文件中创建别名来解决它...

以上是关于调用未定义的函数 curl_init() 即使它在 php7 中启用的主要内容,如果未能解决你的问题,请参考以下文章

在 wamp 2.2 中调用未定义函数 curl_init() 错误

在 wamp 2.2 中调用未定义函数 curl_init() 错误

PHP 致命错误:调用未定义的函数 curl_init()

调用未定义函数 curl_init() 错误

调用未定义的函数 curl_init() - 使用 WAMP

调用未定义的函数 curl_init() - 使用 WAMP