从命令行获取PHP服务器名称

41

有没有一种方法可以从命令行检测运行 PHP 脚本的服务器名称?

有许多方法可以通过 HTTP 访问 PHP 进行此操作。但是似乎没有办法对 CLI 进行此操作。

例如:

$_SERVER['SERVER_NAME'] 

无法从命令行中使用。


1
我想我终于得到了一个半靠谱的答案: $server = system('echo $HOSTNAME');有人有更好的方法吗? - Justin Noel
你连在已选答案旁边打勾的选项都没有吗? - random
如果您需要可移植性,您可能想知道在Windows上(XP,运行WAMP w/ PHP 5.2.6),echo $HOSTNAME会给我完全相同的结果,即$HOSTNAME。然而,Uwe Mesecke和jonstjohn的建议在Windows和Linux(CentOS 5 w/ PHP 5.1.6)上都有效。 - PTBNL
@Random Echo:没有办法表明最佳答案。投票赞成或反对告诉我我的声望不够高。 - Justin Noel
@AppBeacon:看起来我表达得不清楚,抱歉。我的意思只是想说,在Windows上无法使用echo "$HOSTNAME"命令。在我的Linux系统中,代码system('echo $HOSTNAME')输出了我的系统名称。然而,在Windows上,它却输出了字符串"$ HOSTNAME"(引号属于我)。 - PTBNL
显示剩余2条评论
9个回答

92

2
我无法投票。你的答案是最好的。尽管如此,它并不是100%可移植的,因为一些主机会在其中回复额外的垃圾信息。Mac OS X Leopard和OpenSolaris只回复主机名。RHEL3(令人发抖)则回复各种垃圾信息。 - Justin Noel
如果您在同一服务器(IP)上拥有2个域名,它是否能正常工作? - Genjo
机器的主机名和反向地址解析是两个不同的事情... uname 返回主机名,据我所知每台机器应该只有一个。如果您需要进行反向地址查找,则应使用 DNS 客户端。 - Uwe Mesecke
嗯,只是获取计算机名称,但我需要获取本地主机名。 - Luis Alfredo Serrano Díaz

21

12

出于同样的原因,在从CLI运行PHP时,SERVER_NAME不可用。

当您从CLI运行PHP时,您启动自己的PHP解释器,运行您传递给它的任何代码,没有任何类型的服务器。因此,从CLI中,PHP对您未明确告知的Web服务器一无所知。


3
你可以将你的PHP脚本添加到命令行中,这样就可以为你设置$_SERVER['SERVER_NAME']了。以下是我使用它的方法:

C:\ SDK \ php-5.5.25-Win32-VC11-x86 \ php.exe -S localhost:8080 -t D:\ Projects \ Sites \ mysite router.php

router.php
<?php
$_SERVER['SERVER_NAME'] = 'localhost:8080';
return false;    // serve the requested resource as-is.
?> 

3

尝试:

$servername = trim(`hostname`);

1
这似乎是错误的。trim仅删除空格。静态字符串作为输入,这该怎么工作? - Benjamin Eckstein
在这种情况下,它执行Linux命令“hostname”,然后修剪返回的字符串...这个技巧只适用于Linux / Unix环境。尝试这个例子:echo `hostname`; - Nicolai Nita

3
为了从命令行获取主机名,您需要使用php -r运行。在Linux上,我使用了以下命令:
~#php -r 'echo php_uname("n");'
hostname

在Windows上,我使用:

D:\xampp\php>php -r "echo php_uname('n');"
MB-PC

此外,通过控制台访问PHP时,并没有提供传统的$_SERVER值之一。但是,我所访问的服务器只有以下键:
root@hermes:~# php -r 'foreach($_SERVER as $key =>$value){echo $key.",";}'
TERM,SHELL,SSH_CLIENT,SSH_TTY,USER,LS_COLORS,MAIL,PATH,PWD,LANG,SHLVL,HOME,LOGNAME,SSH_CONNECTION,LESSOPEN,LESSCLOSE,_,PHP_SELF,SCRIPT_NAME,SCRIPT_FIL
ENAME,PATH_TRANSLATED,DOCUMENT_ROOT,REQUEST_TIME,argv,argc

1
这个刚刚帮了我大忙,谢谢! - Maxim Kumpan
我需要的是:php -r 'echo php_uname("n")."\n";' - zzapper

3

调用CLI并使用gethostname命令:

php -r "echo gethostname();"

输出:

your_hostname

2
可能是因为如果您从命令行运行脚本,没有涉及到服务器?

1
没有服务器的意思是没有涉及到WEB服务器。然而,我想要脚本实际运行的服务器名称。 - Justin Noel

-6

其中一个可能有服务器名称:

print_r($_SERVER)
var_dump($_SERVER) 
echo $_SERVER['HOSTNAME']

返回服务器的名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接