phpinfo() 和 php -v 显示不同版本的 PHP

Gab*_*ann 32 php

我想知道php我使用的是哪个版本,所以我编写了标准脚本:

phpinfo();
Run Code Online (Sandbox Code Playgroud)

这给了我

PHP version 5.6.10
Run Code Online (Sandbox Code Playgroud)

我的应用程序所需的正确PHP 版本。当我在终端中尝试时:

php -i
Run Code Online (Sandbox Code Playgroud)

或者

php -v
Run Code Online (Sandbox Code Playgroud)

它告诉我:

PHP version 5.3.2
Run Code Online (Sandbox Code Playgroud)

我不需要的。然后我尝试:

which php
Run Code Online (Sandbox Code Playgroud)

它告诉我:

/usr/bin/php
Run Code Online (Sandbox Code Playgroud)

现在我很困惑我使用的是哪个版本的 PHP。这些文件已上传到托管网站,我无法对配置文件(如httpd.confphp.ini.

Jan*_*ski 30

如果您在使用 Apache 在 Ubuntu 14.04 上从 PHP5 升级到 PHP7 时遇到此问题,这对我有帮助(功劳在这里):

在 Apache 上禁用 PHP5 模块:

sudo a2dismod php5
Run Code Online (Sandbox Code Playgroud)

现在启用 PHP7:

sudo a2enmod php7.1
Run Code Online (Sandbox Code Playgroud)

要反映更改,需要重启 Apache:

sudo systemctl restart apache2
Run Code Online (Sandbox Code Playgroud)


Gia*_*968 29

简短的回答。

不要惊慌!如果您担心您的 Apache 服务器使用的phpinfo()是哪个 PHP 版本,那么输出总是您应该注意的。Apache PHP 模块和 PHP 命令行二进制文件是两种不同的东西,不会相互干扰。

事实上,只要您调整 Apache 以正确加载它,您就可以编译和加载您想要与 Apache 一起使用的各种 PHP 版本。在 Apache 解析 PHP 页面的情况下,PHP 命令行界面永远不会发挥作用。

PHP 的命令行版本仅用于命令行特定任务,Apache 的 PHP 模块永远不会触及、使用或需要它。

更长的答案。

你这样说:

我想知道php我使用的是哪个版本,所以我编写了标准脚本:

phpinfo();
Run Code Online (Sandbox Code Playgroud)

这给了我 PHP 版本 5.6.10 -我的应用程序所需的正确PHP 版本。当我在终端中尝试时:

php -i or php -v   
Run Code Online (Sandbox Code Playgroud)

它显示了我不需要的 PHP 版本 5.3.2。

命令行中可用的 PHP 版本与作为模块加载的 PHP 版本 100% 无关。这些是完全独立的事情。

因此,如果您担心您的 Web 应用程序正在使用哪个版本的 PHP,如果phpinfo()显示版本 5.6.10,并且这就是您想要/需要的,那么 100% 很好。

PHP 的命令行版本是一个完全独立的系统项。因此,唯一重要的是phpinfo().

如果出于某种原因您想在 Apache 中使用不同版本的 PHP,您需要做的就是在某处安装已编译的 Apache PHP 模块,然后在系统的 Apache 配置中添加或调整这一行:

LoadModule php5_module    /path/to/php/and/the/module/for/apache2/libphp5.so
Run Code Online (Sandbox Code Playgroud)

只需将路径调整到libphp5.soApache 用来解析 PHP的路径,然后重新启动 Apache,您就可以开始工作了。

例如,有一次我不得不从源代码(带有 GD 库支持)编译 PHP 版本 5.1.6,以便在运行 PHP 5.3.5 的 Ubuntu 12.04 机器上使用。在服务器的 PHP 模块加载文件中:

/etc/apache2/mods-available/php5.load
Run Code Online (Sandbox Code Playgroud)

我有这样的行:

# LoadModule php5_module        /usr/lib/apache2/modules/libphp535.so
LoadModule php5_module        /usr/lib/apache2/modules/libphp516-gd.so
Run Code Online (Sandbox Code Playgroud)

注一行是如何注释掉了libphp535.so,另一个为libphp516-gd.so被注释掉?我所做的是将默认的 PHP 5.3.5 libphp5.soApache 模块重命名为libphp535.so名称中的版本号,以便我可以将它放在那里以供参考,然后命名 PHP 5.1.6(支持 GD 库)模块,libphp516-gd.so这样我就知道是什么了也是。这样我就可以在系统上并排使用它们。

而且——就像我一开始所说的那样——命令行中使用的 PHP 版本与 Apache PHP 模块完全没有关系。因此,您可以在系统上准备好任意数量的不同版本的 Apache PHP 模块;只需调整配置并重新启动 Apache,您就可以正常使用您指定的 Apache 应使用的任何 PHP 版本。