从命令行执行获取Apache Document Root(无浏览器)

Phi*_*ord 10 php url command-line

不确定标题是否正确,如果你想到一个更好的标题,请编辑.

我有一个XMLRPC服务,我从命令行调用.它使用Zend框架.

客户端看起来像这样:

$ server = new Zend_XmlRpc_Client('http://hostname/path/to/xmlrpc.server.php');

该文件位于:

/var/www/html/path/to/xmlrpc.server.php
Run Code Online (Sandbox Code Playgroud)

我现在对它进行了硬编码,但希望通常填充'path/to /'.

我试过了:

function url(){
  $protocol = $_SERVER['HTTPS'] ? "https" : "http";
  return $protocol . "://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
}

echo url();
Run Code Online (Sandbox Code Playgroud)

注意:$ _SERVER选项都没有返回我需要的内容

但是从命令行执行此操作会给我:

http://
Run Code Online (Sandbox Code Playgroud)

getcwd()给我:

 /var/www/html/path/to
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到:

http://path/to
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?

我想这样做的原因是如果项目需要更改它应该自动配置的目录.例:

如果我在这里移动项目:

/var/www/html/path/to/another/location
Run Code Online (Sandbox Code Playgroud)

或者在这里:

/var/www/public_html/path/to/another/location
Run Code Online (Sandbox Code Playgroud)

甚至在这里:

/path/to/document/root/path/to/another/location
Run Code Online (Sandbox Code Playgroud)

我应该得到:

http://hostname/path/to/another/location
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助

更新:

我尝试了这个,但仍未按预期工作:

$hostname = `hostname`;
echo 'http://'.trim($hostname).'/'.basename(getcwd())."\n";
Run Code Online (Sandbox Code Playgroud)

Hen*_*pel 15

简单回答:你做不到.

正如NikiC在他对你的问题的评论中已经说过的那样,从命令行调用脚本意味着没有可用的Web服务器上下文的概念."主机名"和"文档根"的概念仅存在于Web服务器上下文中,并且基于服务器的配置.您的/var/www/something目录中没有任何内容表示"嘿,我是文档根".

为了说明,假设您使用两个文档根配置了两个vhost:

  • vhost A,使用 /var/www/top-docroot
  • vhost B,使用/var/www/top-docroot/nested-docroot.

您的脚本位于:

/var/www/top-docroot/nested-docroot/path/to/xmlrpc.server.php

从命令行调用时,您的脚本应该使用什么路径?

  • vhost A会要求 nested-docroot/path/to/xmlrpc.server.php
  • vhost B会要求 path/to/xmlrpc.server.php

虽然这是一个非常人为的例子,但它仍然应该证明文档根目录只能在Web服务器请求的上下文中可靠地确定,因为它是从配置中读取的.

因此,当从命令行调用时,您的所有脚本都可以尝试从Web服务器配置(也没有可靠的地方)获取信息,或者使用一些启发式方法,例如假设文档根的通用约定居住在/var/www.这两种方法都非常不可靠,您可能更善于坚持使用硬编码值(或将信息作为参数传递给调用).