为什么DOCUMENT_ROOT与远程服务器上的realpath('。')不同

时间:2011-03-12 08:34:15

标签: php zend-framework .htaccess

echo realpath('.').'<br>';
echo dirname(__FILE__).'<br>';
echo realpath(dirname(__FILE__)).'<br>';
echo $_SERVER[PHP_SELF].'<br>'; 
echo getcwd();

我总是

/services2/webpages/util/i/g/gg8375620.provider.com.br/mydomain.com/public

但是在phpinfo中DOCUMENT_ROOT是

/services/webpages/l/i/mydomain.com/public

因为我在.htaccess和Zend Framework一起度过了艰难时期。

在我当地,我能够让它发挥作用。但是在提供者主持人身上我无法掌握魔法。

EDT:我把$_SERVER['DOCUMENT_ROOT'] = realpath($_SERVER['DOCUMENT_ROOT']);放在索引文件上,但得到了这个。

  

致命错误:未捕获的异常'Zend_Config_Exception',消息'parse_ini_file(/services2/webpages/util/i/g/gg8375620.provider.com.br/mydomain.com/public/v0.2b/application/configs/appkeys .ini)[function.parse-ini-file]:无法打开流:没有这样的文件或目录parse_ini_file(/services2/webpages/util/i/g/gg8375620.provider.com.br/mydomain.com/public/ v0.2b / application / configs / appkeys.ini)[function.parse-ini-file]:无法打开流:/services2/webpages/util/i/g/gg8375620.provider.com中没有这样的文件或目录.br / mydomain.com / public / v0.2b / library / Zend / Config / Ini.php:181堆栈跟踪:#0 /services2/webpages/util/i/g/gg8375620.provider.com.br/mydomain。 com / public / v0.2b / library / Zend / Config / Ini.php(201):Zend_Config_Ini-&gt; _parseIniFile('/ services2 / webp ...')#1 / services2 / webpages / util / i / g / gg8375620.provider.com.br/mydomain.com/public/v0.2b/library/Zend/Config/Ini.php(125):Zend_Config_ in /services2/webpages/util/i/g/gg8375620.provider.com。 BR / mydomain.com /公/ V0.2第181行/ b / library / Zend / Config / Ini.php

EDT: 那就是那个:

$appkeys = new Zend_Config_Ini(APPLICATION_PATH . '/configs/appkeys.ini');

和APPLICATION_PATH由

定义
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

5 个答案:

答案 0 :(得分:4)

试试这个:

$_SERVER['DOCUMENT_ROOT'] = realpath($_SERVER['DOCUMENT_ROOT']);
echo $_SERVER['DOCUMENT_ROOT'] . "\n";

阅读this

答案 1 :(得分:2)

可能是DOCUMENT_ROOT中的某些目录实际上是symlinks到其他目录 - 引用the documentation

  

realpath()展开所有符号链接并解析对&#39; /./',&#39; /../'的引用;和额外的&#39; /&#39;输入路径中的字符并返回规范化的绝对​​路径名。

因此,如果(例如),/services/webpages/l是目录,而/services/webpages/l/i是指向/services2/webpages/util/i/g/gg8375620.provider.com.br的符号链接,则/services2/webpages/util/i/g/gg8375620.provider.com.br/mydomain.com/public/services/webpages/l/i/mydomain.com/public都会让你到同一个目录,但realpath()将始终返回前者。

/services
 + webpages
 | - util
 |   - i
 |     - g 
 |       - gg8375620.provider.com.br
 |         - mydomain.com
 |           - public
 + l
   - i -> ../webpages/util/i/g/gg8375620.provider.com.br/

答案 2 :(得分:1)

document_root来自您的Web服务器配置文件,这就是为什么它与realpath函数不同。

答案 3 :(得分:0)

嗯,DOCUMENT_ROOT环境变量只是设置为错误值 如果您无法控制此服务器,则无法自行修复 请求支持人员修复或找到避免使用此变量的方法

由于看起来像ZF问题,我认为这很容易解决 我从来没有使用过该框架,但我确信它有单个入口点或一些配置文件 因此,您可以通过设置以下内容轻松伪造DOCUMENT ROOT:

$_SERVER['DOCUMENT_ROOT'] = realpath(dirname(__FILE__).'/../'); 

其中'/../'表示从这样的入口点到实际文档根目录的相对路径

答案 4 :(得分:0)

echo realpath(dirname( FILE ));

这应该会有所帮助。在此链接上http://www.tech99.us/finding-absolute-path-in-php/you可以找到使用这些功能的详细信息。上面一行中使用的每个函数都可以使用php4和php5。