在PHP中有未解决的符号链接的脚本路径?

时间:2016-05-25 19:43:00

标签: php linux path symlink

假设我们有一个包含以下路径的网络目录:

framework/
    index.php
    ...
instance/
    index.php -> ../framework/index.php (symlink)
    ...

如果我们现在请求(...)/instance/index.php PHP将解析符号链接并将__FILE__设置为(...)/framework/index.php

有没有办法解决这个问题,例如dirname(__FILE__)将是(...)/instance

编辑:由于已经指出,我实际上不确定PHP本身是否正在解析链接或其他内容。就我而言,我使用nginx作为php-fpm作为FastCGI的网络服务器。

(背景是我希望CMS或框架的多个实例引用公共代码库。)

1 个答案:

答案 0 :(得分:1)

如果您可以接受文档中关于dirname($_SERVER['SCRIPT_FILENAME'])变量的一般警告,则最好的近似方法是获取{instance“目录的$_SERVER

  

不能保证每个Web服务器都会提供其中的任何一个;   服务器可能会省略其中一些,或提供此处未列出的其他服务器。

此外,PHP手册does not explicitly promise中将保留符号链接,但情况似乎确实如此(除非您的服务器另行考虑)。另请参见this answer

(注意:这也可以在CLI模式下使用。如果脚本是通过相对路径(到CWD的)启动的,PHP会保持这种方式,所以您可能会以“。”结尾。)

但是,对于一般问题(获取保留了符号链接的 any 脚本目录),此方法不起作用。它仅适用于通过HTTP到达的脚本。由于您以后include的所有其他脚本都将具有相同的$_SERVER['SCRIPT_FILENAME'](当然),无论它们位于何处,如果dirname($_SERVER['SCRIPT_FILENAME'])位于其他位置,则会产生错误的目录...

我认为PHP(从v7.2开始)没有针对此问题的解决方案。

(最初您是正确的:无论您使用的服务器是什么,PHP都在为__FILE__进行符号链接解析。并且该would ever change不太可能,因为它一直保持这种方式太长(取决于它的代码太多),即使realpath()是否需要解析路径,而对于符号链接的情况也没有防弹解决方案。)