当前位置: 首页>>技术教程>>正文


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

, ,

问题描述

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

In phpinfo(),它似乎启用了 curl 。有类似的问题,但没有人在php7中处理过。我认为这应该与其他人有所不同。

编辑:当我尝试

php -i | grep curl       

在终端,它返回

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

最佳办法

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

sudo apt-get install php-curl

和服务器重启

sudo service apache2 restart

一切恢复正常:)

次佳办法

假设条件

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

What is going on here?

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

How do you know which version of PHP Apache is using?

要知道这一点,关键思想是学习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正在使用我的系统上安装的PHP的'php5'版本,无论可能是什么。

然后,我尝试通过运行以下命令,使用此版本的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版本更改为该版本。你要。

How do I tell Apache which version of PHP to use?

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

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

a2dismod php5

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

a2enmod php5.6

然后我重新启动Apache

service apache2 restart

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

第三种办法

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

环境:Ubuntu,php7.1,Laravel 5.6

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

第四种办法

您的文件路径可能不正确

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

第五种办法

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

sudo add-apt-repository ppa:ondrej/php

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/7794.html,未经允许,请勿转载。