【问题标题】:PHP dirname returns symlink pathPHP dirname 返回符号链接路径
【发布时间】:2012-09-16 19:34:51
【问题描述】:

假设我有一个从 '/one/directory/''/two/directory/' 的符号链接。

如果我echo dirname(dirname(\__FILE__)),则返回'/one/directory/'

返回'/two/directory'的最佳方法是什么?

使用示例:

vhost 'example.com' 指向`'/two/directory'

example.com/hello_world.php

<?php 
    echo dirname(dirname(__FILE__));
?>

返回: '/one/directory'

预期结果: '/two/directory'

【问题讨论】:

  • 你的问题不是很清楚,什么是符号链接,什么是真正的目录?根据文档,符号链接是使用旧 php 4.0.2 中的 FILE 自动解析的,因此可以合理地认为,您抱怨您认为符号链接是“两个”目录并且您抱怨 FILE 返回原始 = symlink 解析目录“一个”。虽然这里几乎所有的答案都回复好像原始目录是两个,符号链接一个,并且 PHP 的行为不像他们在文档中写的那样, FILE var 将返回 not symlinked resolved 'one'

标签: php symlink dirname


【解决方案1】:

使用readlink 函数? http://php.net/manual/en/function.readlink.php

你可以用is_link:http://php.net/manual/en/function.is-link.php检查它是否是一个符号链接

if (is_link($link)) {
    echo(readlink($link));
}

【讨论】:

  • 我选择了这个示例,因为我想首先检查它是否是符号链接,因为并非所有环境都使用它们。
  • 感谢@Erwinus 的评论,将有利于人们了解!不幸的是,我没有 Windows 7 机器来测试这个!
  • 更新:现在可以在 Windows 上使用,以及 link()、symlink() 和 linkinfo() - 根据手册,从 PHP 5.3.0 开始。我确认它确实适用于 Windows 7。
【解决方案2】:

使用readlink($path)读取符号链接的目标。

<?php 
    echo readlink(dirname(__FILE__));
?>

【讨论】:

  • 这似乎对我不起作用 - 它不返回任何输出。
  • lorga - 奇怪,我会玩。我想知道它与虚拟主机有关,以及它如何处理符号链接。谢谢!
  • 无论我传递什么,它都会返回Warning: readlink(): Invalid argument :(
  • 你想通过什么?
  • 我已经解决了,但它似乎是倒退的。当我想通过'/one/directory' 获得'/two/directory' 时,我必须通过'/two/directory' 才能工作。
【解决方案3】:
<?php

function getRealFile($path) {
    return is_link($path) ? readlink($path) : $path;
}

$path = getRealFile(dirname(__FILE__));

文档:

http://php.net/manual/en/function.is-link.php
http://php.net/manual/en/function.readlink.php

【讨论】:

  • 根据上面的php docs 4.0.2版, FILE 总是自动符号链接解析,所以我不知道你为什么建议一个函数,隐含做了什么,而提问者要求相反。类似于听起来如何:` function getZero(number) { return number==0 ?数字 * 0 : 数字; } ` 然后发布一个指向数学论坛的链接,提到乘以 0 的结果为零您的答案可能是一个答案,但不是这个问题,当提供的参数是 FILE 时,如您的示例所示
【解决方案4】:

返回 '/two/directory' 的最佳方法是什么?

使用https://github.com/logical-and/symlink-detective

<?php 

echo SymlinkDetective::detectPath(dirname(dirname(__FILE__)));

将返回'/two/directory'

【讨论】:

  • 似乎他想获得一个符号链接路径 = 符号链接未解析的路径,换句话说,你建议他相反 - 他已经拥有的东西,因为在 php 中没有办法不获得非符号链接根据文档使用 FILE 解析路径
【解决方案5】:

也许用 realpath() ? http://php.net/manual/en/function.realpath.php

编辑:readlink 似乎是一个更好的答案:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-02
    • 2013-06-14
    • 1970-01-01
    • 2015-06-10
    • 2014-11-07
    • 2022-10-16
    • 2011-07-23
    • 1970-01-01
    相关资源
    最近更新 更多