控制台中的不同PHP版本以及通过PHP脚本运行php -v时

ycl3bljg  于 2023-08-02  发布在  PHP
关注(0)|答案(1)|浏览(171)

你好,亲爱的Stackoverflow社区,
我在我的服务器(ubuntu)上遇到了一个不寻常的PHP版本问题,我希望你能帮助我。当我通过控制台(SSH)登录到我的服务器并键入php -v时,它显示的是PHP版本8.2。但是,当我在PHP脚本中使用exec('php-v')时,它显示PHP版本7.4。需要注意的是,我对控制台和PHP脚本使用了相同的用户登录凭证(使用whoami进行了验证)。
这种行为让我感到困惑,因为我希望这两个调用显示相同的PHP版本,因为使用的是同一个用户。我不想更改服务器设置;相反,如果可能,我正在寻找一种专门在PHP中解决这个问题的解决方案。有没有办法确保控制台中的php -v和PHP脚本中的exec('php-v')显示相同的PHP版本(最好是8.2)?
我将非常感谢任何帮助或建议,让我解决这个问题。在此先谢谢您!
我不能排除任何可能

fjnneemd

fjnneemd1#

有没有办法确保控制台中的php -v和PHP脚本中的exec('php -v')显示相同的PHP版本(最好是8.2)?
是的,在shell中执行以下php命令以获取php二进制文件的绝对路径名:

$ php -r 'echo PHP_BINARY, "\n";'
/usr/bin/php5.4.2 # only exemplary, you see a different line here

字符串
然后在exec()调用中使用该路径名:

<?php

exec('/usr/bin/php5.4.2 -v'); # again only exemplary, you have a different pathname


然后它已经这样工作了。

讨论及参考文献

正如注解中提到的,这依赖于环境(* environ(7) *)当您仅通过basename(文件名)指定命令时,将搜索PATH以查找二进制文件的真实的路径名。
由于您有不同的环境,一个在交互式shell中,另一个在exec()调用中运行的shell中(在PHP-FPM子程序中或在web服务器中运行),使用绝对路径名可以阻止任何PATH解析,因此独立于这个和其他环境参数(PWD是另一个)。
现在是PHP_BINARY常数(PHP 5.4+; Mar 2012)也是类似的,它将PHP二进制文件的绝对路径名作为字符串¹。
您必须首先在shell中获得它,因为您希望使用PHP-CLI版本(参见:PHP CLI SAPI,Using PHP from the command line)。
这样做比我在前面的评论中建议的要好,因为它不涉及调用另一个命令,特别是一个名为 command 的命令本身,因为你可能还不知道它。这就是PHP。
当然,你已经可以在shell中解析以显示任何命令的绝对路径名(如果找不到命令,则显示错误):

$ command -v php
/usr/bin/php
$ echo $?
0


它在当前环境中显示它,它对它的依赖可以通过清空它来证明:

$ PATH= command -v php
$ echo $?
1


¹ PHP_BINARY是空字符串(“”),如果在PHP启动时无法获得。通常它是一个绝对路径名,当前正在执行的PHP二进制文件的realpath(按照约定)。

相关问题