调用未定义的函数 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() 错误