假设
您已经安装了您正在使用的 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
在我刷新网站上的违规页面后,错误现在消失了。