PHP __FILE__ 在 IIS 上 returns 使用 MKLINK 创建的符号链接文件夹的路径错误
PHP __FILE__ on IIS returns wrong path for symlinked folders created with MKLINK
我正在调试一个Microsoft IIS特有的问题,具体是IIS10,不知道其他版本的IIS是否也有这个问题。我的 WordPress 插件有问题,当我 运行 它在 Apache 服务器上,或者在任何 Apache/Linux/nginx 网络服务器上的 Local by Flywheel 测试环境中时,它都能正常工作。
问题涉及 PHP 内置常量 __FILE__ 到符号 linked 文件夹。
我为我的插件开发文件夹创建了符号 link,如下所示:
Website is here: c:\inetpub\my-web-site
The plugin lives here: c:\users\me\onedrive\plugins\my-plugin
我在文件夹中创建了一个符号link:
c:\inetpub\my-web-site\wp-content\plugins
在命令行中使用以下命令。
c:
cd \inetpub\my-web-site\wp-content\plugins
mklink /J my-plugin c:\users\me\onedrive\plugins\my-plugin
Web 服务器将插件文件夹视为:
c:\inetpub\my-web-site\wp-content\plugins\my-plugin
这是简单的部分。
在 PHP 中,从 WordPress 网站内部,PHP 常量 __FILE__(仅限 IIS)return 是错误的路径。
具体来说,调用 PHP 常量 __FILE__ return 是错误的路径。
添加此代码:
$path = __FILE__;
到这个文件:
c:\inetpub\my-web-site\wp-content\plugins\my-plugin\my-plugin.php
$path 都将 return:
c:\users\me\onedrive\plugins\my-plugin\my-plugin.php
我预计 __FILE__ 到 return:
c:\inetpub\my-web-site\wp-content\plugins\my-plugin\my-plugin.php
换句话说,在 IIS10 上,PHP 常量 __FILE__ return 是符号 linked 文件夹的物理(目标)路径,如操作系统,而不是 Web 服务器看到的文件的物理路径。
就目前而言,这完全违背了在 IIS 中使用符号 linked 文件夹的目的。
我的问题:有人知道吗 1) 有补救办法吗? 2) 是否有不涉及使用 WP_CONTENT_DIR 的解决方法?和 3) 我错过了什么吗?
这是 PHP 中的 expected behavior 并且已记录在案。 paths/filenames 的魔法常量总是解析路径,以便符号链接被替换为它们的目标路径。
SO 问题中的建议是使用 $_SERVER["SCRIPT_FILENAME"]
。如果您正在测试的文件已通过另一个目录中的另一个 PHP 文件包含在内,那么这可能不起作用。还有其他一些建议,但最终解决方案可能会归结为 mounting the directory to a path(就像你开车一样)。
我正在调试一个Microsoft IIS特有的问题,具体是IIS10,不知道其他版本的IIS是否也有这个问题。我的 WordPress 插件有问题,当我 运行 它在 Apache 服务器上,或者在任何 Apache/Linux/nginx 网络服务器上的 Local by Flywheel 测试环境中时,它都能正常工作。
问题涉及 PHP 内置常量 __FILE__ 到符号 linked 文件夹。
我为我的插件开发文件夹创建了符号 link,如下所示:
Website is here: c:\inetpub\my-web-site
The plugin lives here: c:\users\me\onedrive\plugins\my-plugin
我在文件夹中创建了一个符号link:
c:\inetpub\my-web-site\wp-content\plugins
在命令行中使用以下命令。
c:
cd \inetpub\my-web-site\wp-content\plugins
mklink /J my-plugin c:\users\me\onedrive\plugins\my-plugin
Web 服务器将插件文件夹视为:
c:\inetpub\my-web-site\wp-content\plugins\my-plugin
这是简单的部分。
在 PHP 中,从 WordPress 网站内部,PHP 常量 __FILE__(仅限 IIS)return 是错误的路径。 具体来说,调用 PHP 常量 __FILE__ return 是错误的路径。
添加此代码:
$path = __FILE__;
到这个文件:
c:\inetpub\my-web-site\wp-content\plugins\my-plugin\my-plugin.php
$path 都将 return:
c:\users\me\onedrive\plugins\my-plugin\my-plugin.php
我预计 __FILE__ 到 return:
c:\inetpub\my-web-site\wp-content\plugins\my-plugin\my-plugin.php
换句话说,在 IIS10 上,PHP 常量 __FILE__ return 是符号 linked 文件夹的物理(目标)路径,如操作系统,而不是 Web 服务器看到的文件的物理路径。
就目前而言,这完全违背了在 IIS 中使用符号 linked 文件夹的目的。
我的问题:有人知道吗 1) 有补救办法吗? 2) 是否有不涉及使用 WP_CONTENT_DIR 的解决方法?和 3) 我错过了什么吗?
这是 PHP 中的 expected behavior 并且已记录在案。 paths/filenames 的魔法常量总是解析路径,以便符号链接被替换为它们的目标路径。
SO 问题中的建议是使用 $_SERVER["SCRIPT_FILENAME"]
。如果您正在测试的文件已通过另一个目录中的另一个 PHP 文件包含在内,那么这可能不起作用。还有其他一些建议,但最终解决方案可能会归结为 mounting the directory to a path(就像你开车一样)。