从脚本中获取当前的PHP可执行文件?

ben*_*izi 20 php

我想从PHP cli中运行PHP cli程序.在一些运行它的机器上,安装了php4和php5.如果我运行外部程序为

php5 outer.php
Run Code Online (Sandbox Code Playgroud)

我希望内部脚本使用相同的php版本运行.在Perl中,我将使用$^Xperl可执行文件.看来PHP中没有这样的变量?

现在,我正在使用$_SERVER['_'],因为bash(和zsh)将环境变量$_设置为最后运行的程序.但是,我宁愿不依赖于特定于shell的习语.

更新:版本差异只是一个问题.例如,如果PHP不在PATH中,或者不是PATH中找到的第一个版本,则查找版本信息的建议将无济于事.

此外,csh变体似乎没有$_为其进程设置环境变量,因此解决方法在那里不适用.

更新2:我正在使用$_SERVER['_'],直到我发现它没有做正确的事情xargs(这是有道理的...... zsh将它设置为它运行的命令,这xargs不是php5,并且xargs不会更改变量).回归使用:

$version = explode('.', phpversion());
$phpcli = "php{$version[0]}";
Run Code Online (Sandbox Code Playgroud)

Kri*_*ves 32

值得注意的是,现在在PHP 5.4+中你可以使用预定义的常量--PHP_BINARY:

PHP_BINARY

指定脚本执行期间的PHP二进制路径.从PHP 5.4开始提供.

  • 注意:在Apache2handler中返回`httpd`路径. (2认同)

小智 8

在我的服务器上我是php 5.3.14.

我找到了一个预定义的常量: PHP_BIN_DIR

然后,假设可执行文件的文件名始终为"php",请$php_cmd = PHP_BIN_DIR.'/php'指向我的PHP可执行文件.

  • 我赞成了答案和评论,但在Windows中尝试后取回了upvotes.无论现实如何,总会返回`C:\ php`. (10认同)
  • [根据手册](http://www.php.net/manual/en/reserved.constants.php),它没有说它何时被添加,它是`PHP_BINDIR`(没有第二个下划线).这是一个相当不错的答案.谢谢. (4认同)

小智 6

更新; 现在也PHP_BINARY可以使用(使用 PHP 7.4 附带的 XAMPP 进行测试)。XAMPP


旧答案

不幸的是 PHP_BINARY 正在返回httpd二进制文件(在 Windows XAMPP上),所以我又回到使用路径......

    if (defined('PHP_BINARY') &&
                PHP_BINARY &&
                in_array(PHP_SAPI, array('cli', 'cli-server')) &&
                is_file(PHP_BINARY)) {

          return PHP_BINARY;
    } else if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
        $paths = explode(PATH_SEPARATOR, getenv('PATH'));
        foreach ($paths as $path) {
            if (substr($path, strlen($path)-1) == DIRECTORY_SEPARATOR) {
                $path = substr($path, 0, strlen($path)-1);
            }
            if (substr($path, strlen($path) - strlen('php')) == 'php') {
                $response = $path.DIRECTORY_SEPARATOR . 'php.exe';
                if (is_file($response)) {
                    return $response;
                }
            } else if (substr($path, strlen($path) - strlen('php.exe')) == 'php.exe') {
                if (is_file($response)) {
                    return $response;
                }
            }
        }
    } else {
        $paths = explode(PATH_SEPARATOR, getenv('PATH'));
        foreach ($paths as $path) {
            if (substr($path, strlen($path)-1) == DIRECTORY_SEPARATOR) {
                $path = substr($path, strlen($path)-1);
            }
            if (substr($path, strlen($path) - strlen('php')) == 'php') {
                if (is_file($path)) {
                    return $path;
                }
                $response = $path.DIRECTORY_SEPARATOR . 'php';
                if (is_file($response)) {
                    return $response;
                }
            }
        }
    }
    return null;
Run Code Online (Sandbox Code Playgroud)