![为什么 phpinfo() 显示版本 5.5.9 而 php -v 显示版本 7.0](https://linux22.com/image/103693/%E4%B8%BA%E4%BB%80%E4%B9%88%20phpinfo()%20%E6%98%BE%E7%A4%BA%E7%89%88%E6%9C%AC%205.5.9%20%E8%80%8C%20php%20-v%20%E6%98%BE%E7%A4%BA%E7%89%88%E6%9C%AC%207.0.png)
我正在 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-cli
、php-cgi
和php-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-cgi
SAPI 实例,并向其传递要运行的脚本。这个SAPI将有它自己的运行时配置(可以通过使用启动服务器来查看strace
。)
如果您php
从命令行运行,您将再次获得不同的SAPI,可能有它自己的运行时配置,这可以再次确认和strace php -v
。
每个 SAPI 通常都源自相同的编译操作,因此共享许多编译时配置(例如要添加哪些扩展以及它们是否应该静态编译或在运行时链接)以及版本号等。
这就是您获得行为的原因当您尝试探测 PHP 的配置时,它们足够相似,足以让您认为它们是同一个程序,但在某些方面仍然不一致,它们是单独的程序,在底层共享许多相同的对象,但具有不同的配置和设计用于服务不同的环境,例如,当 PHP-cli(composer 运行的程序)打印错误消息时,它期望将它们打印到终端,因此它打印纯文本,当 ,php-fpm
或php-cgi
打印相同的错误时会将其包装在 HTML 中,因为它假定它与某些 Web 相关进程进行交互。 php-debug 再次期望以不同的方式进行交互,在端口 9000 上接收数据连接等......
答案3
我怀疑(我没有 Ubuntu 框可以检查)该问题与 php-cgi 和命令行使用的直接 php 之间的差异有关。看起来 Ubuntu 在安装 LAMP 堆栈时使用了 phpX-cgi。 cgi 版本使用 php.ini 文件,这会使问题进一步复杂化,因为它会更改 cwd 的路径。