Ответ 1
Стоит отметить, что теперь в PHP 5.4+ вы можете использовать предопределенную константу - PHP_BINARY:
PHP_BINARY
Задает двоичный путь PHP во время выполнения script. Доступно с PHP 5.4.
Я хочу запустить 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]}";
Стоит отметить, что теперь в PHP 5.4+ вы можете использовать предопределенную константу - PHP_BINARY:
PHP_BINARY
Задает двоичный путь PHP во время выполнения script. Доступно с 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
, могут предоставить вам имя исполняемого файла, но не полный путь к исполняемому файлу. Я смог найти только примеры для нахождения полного пути с помощью PID для С++, AutoHotkey и т.п. Если у кого-то есть предложения о том, где еще я мог бы выглядеть, сообщите мне.
PS: Чтобы получить PID в PHP для Windows, вам, видимо, нужно позвонить getmypid().
Вы можете использовать phpversion()
, чтобы получить текущую версию PHP, прежде чем выполнять "внутренний" script.
Есть ли что-нибудь полезное в $_ENV
?
Переменная окружения SHELL в Unix имеет путь к текущей оболочке. Если вы добавите #!/path/to/php
в начало вашего файла PHP, сделайте его исполняемым и запустите файл напрямую, $_ENV['SHELL']
содержит /path/to/php
?
К сожалению, 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;
Этот ответ был полезен для отслеживания местоположения php: Как получить путь от PHP BIN от PHP?
Это также windows и linux friendly:)
Вы можете попробовать и проанализировать результат phpinfo().
Я думаю, что bestconstant PHP_BINARY. С PHP 5.5.12
Я знаю, что этот вопрос немного устарел, но он появился, ища более короткий способ сделать это.
К сожалению, я не могу найти более короткий путь, но это работает очень хорошо и совместима с несколькими версиями ОС /PHP.
$lookIn, вероятно, может быть расширен, чтобы включить более распространенные местоположения.
https://gist.github.com/cjsewell/39b60065ae2af677ceb1
Надеюсь, что это поможет кому-то