假设我们有一个包含以下路径的网络目录:
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或框架的多个实例引用公共代码库。)
答案 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()
是否需要解析路径,而对于符号链接的情况也没有防弹解决方案。)