为什么 phpinfo() 显示版本 5.5.9 而 php -v 显示版本 7.0

为什么 phpinfo() 显示版本 5.5.9 而 php -v 显示版本 7.0

我正在 vagrant box 上运行 ubuntu,并成功运行和开发 LAMP 应用程序。

mbstring背景:我正在尝试使用 Composer 安装 Laravel 并收到“您的系统中缺少所请求的 PHP 扩展”。

我的/etc/php目录包含两个目录:7.0 和 7.1

然而,当我运行一个文件时phpinfo(),它告诉我我正在运行PHP Version 5.5.9-1ubuntu4.20

但执行时php -v说我正在运行版本 7.0.14:

root@vagrant-ubuntu-trusty-64:/var/www/homebase/src# php -v
PHP 7.0.14-2+deb.sury.org~trusty+1 (cli) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.14-2+deb.sury.org~trusty+1, Copyright (c) 1999-2016, by Zend Technologies

问题:为什么我会看到差异?

答案1

phpinfo()显示 Apache PHP 模块的版本,该模块由libapache2-mod-php.您需要对其进行升级(或安装特定版本之一,例如libapache2-mod-php7.1)。

答案2

为什么我会看到差异?

在编译 ( make) 时 - PHP 的源配置触发多个 SAPI 的构建。例如php-cliphp-cgiphp-debug其他取决于您的编译时配置。
注意:您可能无法使用 PHP 的 debian 或 ubuntu 打包版本访问编译时配置选项,因为软件包维护者在过去(不确定它是否仍然适用)进行了更改,从而抑制了打印编译时配置(使用php-config),请参阅:https://lists.ubuntu.com/archives/ubuntu-server-bugs/2010-April/034631.html

否则,每个 SAPI 都是一个二进制可执行文件,它为想要在 PHP 解释器上运行 PHP 代码的任何内容提供交互点。在make install或或包配置期间,checkinstall --pkgname=php-self-compiled这些 SAPI 将被放置在文件系统上的不同位置。
cli SAPI - 您在运行时获得的php -v,可能会放置在类似/bin/php或 的地方,/usr/bin/php并且 cgi SAPI 将在启动时通过 init 脚本或 systemd 作为守护进程(作为 webserving 子系统的一部分)启动。
因此,想要运行 PHP 脚本的 Web 服务器将使用预先启动的php-cgiSAPI 实例,并向其传递要运行的脚本。这个SAPI将有它自己的运行时配置(可以通过使用启动服务器来查看strace。)
如果您php从命令行运行,您将再次获得不同的SAPI,可能有它自己的运行时配置,这可以再次确认和strace php -v

每个 SAPI 通常都源自相同的编译操作,因此共享许多编译时配置(例如要添加哪些扩展以及它们是否应该静态编译或在运行时链接)以及版本号等。
这就是您获得行为的原因当您尝试探测 PHP 的配置时,它们足够相似,足以让您认为它们是同一个程序,但在某些方面仍然不一致,它们是单独的程序,在底层共享许多相同的对象,但具有不同的配置和设计用于服务不同的环境,例如,当 PHP-cli(composer 运行的程序)打印错误消息时,它期望将它们打印到终端,因此它打印纯文本,当 ,php-fpmphp-cgi打印相同的错误时会将其包装在 HTML 中,因为它假定它与某些 Web 相关进程进行交互。 php-debug 再次期望以不同的方式进行交互,在端口 9000 上接收数据连接等......

答案3

我怀疑(我没有 Ubuntu 框可以检查)该问题与 php-cgi 和命令行使用的直接 php 之间的差异有关。看起来 Ubuntu 在安装 LAMP 堆栈时使用了 phpX-cgi。 cgi 版本使用 php.ini 文件,这会使问题进一步复杂化,因为它会更改 cwd 的路径。

相关内容