代码之家  ›  专栏  ›  技术社区  ›  aim2k1

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

  •  0
  • aim2k1  · 技术社区  · 3 年前

    你好,亲爱的Stackoverflow社区,

    我的服务器(ubuntu)上的PHP版本遇到了一个不寻常的问题,我希望你能帮助我。当我通过控制台(SSH)登录到我的服务器并键入PHP-v时,它会显示我的PHP版本8.2。然而,当我在php脚本中使用exec('hp-v')时,它显示的是php 7.4版本。需要注意的是,我对控制台和PHP脚本使用相同的用户登录凭据(使用whoami验证)。

    这种行为让我感到困惑,因为我希望两个调用都显示相同的PHP版本,因为使用的是相同的用户。我不想更改服务器设置;相反,如果可能的话,我正在寻找一个专门在PHP中解决这个问题的解决方案。有没有办法确保控制台中的php-v和php脚本中的exec('php-v')都显示相同的php版本(最好是8.2)?

    如果能为我解决这个问题提供任何帮助或建议,我将不胜感激。提前谢谢!

    我真的不能排除任何可能性

    0 回复  |  直到 3 年前
        1
  •  0
  •   hakre    3 年前

    有没有办法确保两者 php -v 在控制台和 exec('php -v') 在PHP脚本中显示相同的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(filename)指定命令时 PATH 正在搜索二进制文件的真实路径名。

    由于您有不同的环境,一个在交互式shell中,另一个在exec()调用(在PHP-FPM子级或Web服务器中运行)中运行的shell中,使用绝对路径名会阻止任何PATH解析,因此独立于此和其他环境参数工作( PWD 是另一个)。

    现在 PHP_BINARY constant (PHP 5.4+;2012年3月)也有类似的问题,它将PHP二进制文件的绝对路径名作为字符串。

    您必须首先在shell中获得它,因为您想使用PHP-CLI版本(参见PHP CLI SAPI, Using PHP from the command line ).

    这样做比我在早期评论中建议的要好,因为它不需要调用另一个命令,尤其是调用 命令 这是一个简单的PHP。

    当然,您已经可以在shell中解析以显示任何命令的绝对路径名(如果找不到命令,则显示错误):

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

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

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

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