【问题标题】:Have script path with unresolved symlinks in PHP?PHP 中有未解析符号链接的脚本路径吗?
【发布时间】:2016-09-23 14:19:30
【问题描述】:

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

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 或框架实例。)

【问题讨论】:

  • 你确定是 PHP 做的,而不是网络服务器?
  • 没有。我只是从 php 手册中猜到:__FILE__ The full path and filename of the file with symlinks resolved. 可能这不是 php 本身完成的。
  • 这解决了我的问题 [dirname($_SERVER['SCRIPT_FILENAME'])](stackoverflow.com/questions/10525880/…)

标签: php linux path symlink


【解决方案1】:

如果您可以接受文档中关于$_SERVER vars 的一般警告,则您的情况的最佳近似值是dirname($_SERVER['SCRIPT_FILENAME']) 以获得“实例”目录:

无法保证每台网络服务器都会提供其中任何一项; 服务器可能会省略一些,或提供此处未列出的其他内容。

另外,PHP 手册does not explicitly promise 将保留符号链接,但似乎确实如此(除非您的服务器当然不这么认为)。另见this answer

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

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

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

(你一开始是对的:PHP 正在为__FILE__ 进行符号链接解析,无论你的服务器如何。而且这would ever change 不太可能,因为它已经保持这种状态太久了(并且太多的代码依赖它),即使如果我们想要解析的路径有realpath(),而对于符号链接的情况没有防弹解决方案。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 2013-02-20
    相关资源
    最近更新 更多