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

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

php5 outer.php 

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

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

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

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

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

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

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

PHP_BINARY

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

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

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

Тогда, предположив, что имя файла исполняемого файла всегда «php», $php_cmd = PHP_BIN_DIR.'/php' указывает на исполняемый файл PHP.

Хорошо, так что это уродливо, но работает на 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 могут tasklist имя исполняемого файла, но не полный путь к исполняемому файлу. Я смог найти примеры для поиска полного пути, заданного PID для C ++ , AutoHotkey и тому подобного. Если у кого-нибудь есть предложения о том, где еще я мог бы смотреть, дайте мне знать.

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

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

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

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

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

Этот ответ был полезен для отслеживания местоположения php: как получить путь от PHP BIN от PHP?

Это также windows и linux friendly 🙂

К сожалению, 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; 

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

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

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

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

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

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

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