我想从PHP CLI中运行PHP CLI程序。在运行此命令的某些计算机上,同时安装了PHP 4和PHP 5。如果我以如下方式运行外部程序
php5 outer.php
我希望内部脚本与相同的PHP版本运行。在Perl中,我会使用$^X
来获取Perl可执行文件。似乎在PHP中没有这样的变量。
现在,我使用$_SERVER['_']
,因为Bash (和zsh)将环境变量$_
设置为最后运行的程序。但是,我不想依赖特定于shell的习惯用法。
更新:版本差异只是一个问题。例如,如果PHP不在PATH中,或者不是PATH中找到的第一个版本,那么查找版本信息的建议就不会有什么帮助。
此外,csh
及其变体似乎没有为它们的进程设置$_
环境变量,因此解决方法在这里是不适用的。
更新2:我一直在使用$_SERVER['_']
,直到我发现它在xargs
下不能做正确的事情(这是有道理的……zsh
将其设置为它运行的命令,该命令是xargs
,而不是php5
,并且xargs
不会更改该变量)。我退回到使用:
$version = explode('.', phpversion());
$phpcli = "php{$version[0]}";
发布于 2012-06-21 17:04:23
在我的服务器上安装了PHP 5.3.14。
我找到了一个预定义的常量:PHP_BIN_DIR
然后,假设可执行文件的文件名始终是' PHP ',$php_cmd = PHP_BIN_DIR.'/php'
将指向我的PHP可执行文件。
发布于 2015-10-08 00:17:53
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;
发布于 2010-03-04 03:40:22
好吧,这很难看,但它在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可执行文件,如tasklist
,可以提供可执行文件的名称,但不能提供可执行文件所在位置的完整路径。我只能找到在给定C++、AutoHotkey等PID的情况下找到完整路径的示例。如果任何人有任何建议,我可以在其他地方寻找,让我知道。
PS:要在PHP for Windows中获得PID,显然必须调用getmypid()。
https://stackoverflow.com/questions/2372624
复制相似问题