【发布时间】:2011-04-05 10:58:41
【问题描述】:
在 Linux 上,$_SERVER["_"] 包含 PHP 解释器可执行文件的路径(例如,/usr/bin/php -r 'echo $_SERVER["_"];' 将打印 /usr/bin/php)。在带有 PHP 5.3 的 Windows XP 上,$_SERVER["_"] 是 NULL。
【问题讨论】:
标签: php windows environment-variables
在 Linux 上,$_SERVER["_"] 包含 PHP 解释器可执行文件的路径(例如,/usr/bin/php -r 'echo $_SERVER["_"];' 将打印 /usr/bin/php)。在带有 PHP 5.3 的 Windows XP 上,$_SERVER["_"] 是 NULL。
【问题讨论】:
标签: php windows environment-variables
我抛弃了$_SERVER,得到了很多适合任何口味的选择 :)
array(100) {
...
["PHPBIN"]=>
string(43) "d:\openserver\modules\php\PHP-7-x64\php.exe"
["PHPDIR"]=>
string(36) "d:\openserver\modules\php\PHP-7-x64\"
["PHPRC"]=>
string(35) "d:\openserver\modules\php\PHP-7-x64"
["PHP_BIN"]=>
string(43) "d:\openserver\modules\php\PHP-7-x64\php.exe"
["PHP_BINARY"]=>
string(43) "d:\openserver\modules\php\PHP-7-x64\php.exe"
["PHP_BINDIR"]=>
string(36) "d:\openserver\modules\php\PHP-7-x64\"
["PHP_DIR"]=>
string(36) "d:\openserver\modules\php\PHP-7-x64\"
...
}
【讨论】:
这与 PHP 本身无关。定义该环境变量的是shell。 PHP 只是把它捡起来
例如,见here:
shell设置了一些默认的shell变量; PS2就是其中之一。在 Korn shell 中设置或使用的其他有用的 shell 变量是:
- _(下划线) -- 当shell执行外部命令时,在新进程的环境中设置为执行命令的路径。在交互使用中,这个参数也在父shell中设置为上一条命令的最后一个单词。
- ...
我认为在 Windows 中最好的方法是编写一个内部函数。例如
PHP_FUNCTION(get_php_path)
{
char path[MAX_PATH];
int result;
if (zend_parse_parameters_none() == FAILURE)
return;
result = GetModuleFileNameA(NULL, path, MAX_PATH);
if (result == 0)
RETURN_FALSE;
if (result == MAX_PATH) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Path is too large");
RETURN_FALSE;
}
RETURN_STRINGL(path, result, 1);
}
例子:
>php -r "echo get_php_path()"; D:\Users\Cataphract\Documents\php-trunk\Debug_TS\php.exe【讨论】:
不是找到 php.exe 的真正解决方案,但您可以使用 include_path 或 extension_dir 并转到应存储 php.exe 的父目录。举个例子:
echo str_replace('\ext', '', ini_get('extension_dir'));
【讨论】:
虽然不完美,但你可以试试这个:
$_SERVER['phprc'] . 'php.exe'
这会给你类似的东西
C:\Program Files\PHP\php.exe
【讨论】:
我假设您指的是在 CLI 模式下运行 PHP。
我刚刚在 Windows 7 上的 CLI PHP 5.3 中对此进行了测试,实际上似乎无法找出当前脚本正在运行的 PHP 可执行文件($_SERVER["_"] 索引不可用;也没有包含可执行文件路径的其他变量)。
另外,PHP 手册中的Command Line PHP on Windows 页面对这个问题也没什么可说的。 argv 和 php_sapi_name() 也不透露任何信息。
唯一想到的是在调用脚本之前设置环境变量的笨拙解决方法:
SET PHPEXE=C:\php\bin\php.exe
c:\php\bin\php.exe -f scriptname.php
然后在 PHP 脚本中:
$php_exe_path = $_SERVER["PHPEXE"];
不是很好,但我没有更好的主意....
【讨论】: