PHP 中是否有带有未解析符号链接的脚本路径?

Have script path with unresolved symlinks in PHP?

假设我们有一个具有以下路径的 Web 目录:

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或Framework的多个实例引用一个公共代码库。)

如果您可以接受文档中关于 $_SERVER vars 的一般警告:[=20],那么您的案例的最佳近似值是 dirname($_SERVER['SCRIPT_FILENAME']) 以获得 "instance" 目录=]

There is no guarantee that every web server will provide any of these; servers may omit some, or provide others not listed here.

此外,PHP 手册 does not explicitly promise that symlinks will be preserved, but that seems to be the case (unless of course your server thinks otherwise). See also this answer

(注意:这也适用于 CLI 模式。如果脚本是通过相对路径(到 CWD)启动的,PHP 将保持这种方式,因此您可能会以“.”结尾。然后。)

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

我认为 PHP 今天没有解决方案(从 v7.2 开始)。

(你最初是对的:PHP 正在为 __FILE__ 进行符号链接解析,而不管你的服务器。而且这个 would ever change 不太可能,因为它已经以这种方式停留了太久(并且有太多代码依赖于它),即使如果我们想要解析的路径有 realpath(),而对于符号链接的情况没有防弹解决方案。)