Подтвердить что ты не робот

Получить текущий исполняемый файл PHP из script?

Я хочу запустить PHP-программу cli из PHP cli. На некоторых машинах, где это будет выполняться, устанавливаются как php4, так и php5. Если я запускаю внешнюю программу как

php5 outer.php

Я хочу, чтобы внутренний script запускался с той же версией php. В Perl я использовал бы $^X, чтобы получить исполняемый файл perl. Кажется, нет такой переменной в PHP?

В настоящее время я использую $_SERVER['_'], потому что bash (и zsh) задает переменную окружения $_ для последней программы. Но я бы предпочел не полагаться на специфичную для оболочки идиому.

ОБНОВЛЕНИЕ: Различия версий - это только одна проблема. Если PHP не находится в PATH, например, или не является первой версией, найденной в PATH, предложения по поиску информации о версии не помогут.

Кроме того, csh и варианты, как представляется, не устанавливают переменную среды $_ для своих процессов, поэтому обходной путь там не применим.

ОБНОВЛЕНИЕ 2: Я использовал $_SERVER['_'], пока не обнаружил, что он не подходит в xargs (что имеет смысл... zsh устанавливает его в команду, которую он запускал, t27 > , а не php5, а xargs не изменяет переменную). Возвращаясь к использованию:

$version = explode('.', phpversion());
$phpcli = "php{$version[0]}";
4b9b3361

Ответ 1

Стоит отметить, что теперь в PHP 5.4+ вы можете использовать предопределенную константу - PHP_BINARY:

PHP_BINARY

Задает двоичный путь PHP во время выполнения script. Доступно с PHP 5.4.

Ответ 2

На моем сервере у меня php 5.3.14.

Я нашел предопределенную константу: PHP_BIN_DIR

Затем, если имя файла исполняемого файла всегда "php", $php_cmd = PHP_BIN_DIR.'/php' указывает на исполняемый файл PHP.

Ответ 3

Хорошо, так что это уродливо, но он работает на Linux:

<?php
    // Returns the full path of the current PHP executable
    function get_proc_name(){
       // Gets the PID of the current executable
       $pid = posix_getpid();

       // Returns the exact path to the PHP executable.
       $exe = exec("readlink -f /proc/$pid/exe");
       return $exe;
    }

Я попытаюсь продолжить работу над версией Windows.

ИЗМЕНИТЬ

Не похоже, чтобы какой-нибудь простой способ сделать это для Windows. Некоторые исполняемые файлы Windows, такие как tasklist, могут предоставить вам имя исполняемого файла, но не полный путь к исполняемому файлу. Я смог найти только примеры для нахождения полного пути с помощью PID для С++, AutoHotkey и т.п. Если у кого-то есть предложения о том, где еще я мог бы выглядеть, сообщите мне.

PS: Чтобы получить PID в PHP для Windows, вам, видимо, нужно позвонить getmypid().

Ответ 4

Вы можете использовать phpversion(), чтобы получить текущую версию PHP, прежде чем выполнять "внутренний" script.

http://php.net/manual/en/function.phpversion.php

Ответ 5

Есть ли что-нибудь полезное в $_ENV?

Переменная окружения SHELL в Unix имеет путь к текущей оболочке. Если вы добавите #!/path/to/php в начало вашего файла PHP, сделайте его исполняемым и запустите файл напрямую, $_ENV['SHELL'] содержит /path/to/php?

Ответ 6

К сожалению, PHP_BINARY возвращает двоичный файл httpd (на окнах 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;

Ответ 8

Вы можете попробовать и проанализировать результат phpinfo().

Ответ 9

Я думаю, что bestconstant PHP_BINARY. С PHP 5.5.12

Ответ 10

Я знаю, что этот вопрос немного устарел, но он появился, ища более короткий способ сделать это.

К сожалению, я не могу найти более короткий путь, но это работает очень хорошо и совместима с несколькими версиями ОС /PHP.

$lookIn, вероятно, может быть расширен, чтобы включить более распространенные местоположения.

https://gist.github.com/cjsewell/39b60065ae2af677ceb1

Надеюсь, что это поможет кому-то