将符号链接包含在PHP中时,是否可以将符号链接视为实际目录

时间:2011-09-06 22:27:57

标签: php

我有一个看起来像这样的文件夹

/optik
   |- shadow
    - auth.ini
   |- htdocs
       |- index.php 

我有一个实际的目录

/
  |- skel
      |- include.php

现在,我从skel创建了一个符号链接阴影,所以我在skel中放置的内容将出现在shadow文件夹中。我这样做是因为我在skel中有动态文件,我会不时更改,所以我不想在每个用户文件夹中保留skel内容的重复副本。所以我想到了一个快捷链接。

但是现在我想看看我的index.php是否可以做这样的事情

的index.php

<?
   include "/optik/shadow/include.php";

   // content

和我的include.php

<?
   include "../auth.ini";

   // some stuff with auth.ini

我的目标是,我想知道我是否可以像PHP中的实际目录一样使用符号链接。从符号链接的角度来看,它需要在1个目录中访问auth.ini,但在实际的skel目录中该文件不存在,我需要指定我的auth.ini的整个目录路径。但是,由于用户文件夹都不同,因此无法知道要指定的目录路径。

我怎样才能让这样的事情发挥作用?

2 个答案:

答案 0 :(得分:3)

PHP应该尊重符号链接并遵循它们,就好像它们是标准目录一样。

但是,您仍在使用index.php所在的原始目录。这意味着include "../auth.ini";调用将在/optik(上面的htdocs目录)而不是上面包含的文件所在的目录中查找。

您可以使用realpath()dirname()的组合来计算您想要获取的文件的实际规范路径。

答案 1 :(得分:1)

根据您的示例,要包含optik/auth.ini文件中的optik/shadow/include.php index.php,您可以使用以下内容

// optik/htdocs/index.php

// First, add the `optik` directory to the include path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(dirname(dirname(__FILE__))),
    get_include_path()
));
include 'shadow/include.php';

// optik/shadow/include.php
include 'auth.ini';

由于index.php是父文件,因此将包含路径从那里级联设置为任何其他包含的文件。

现在,关于符号链接,你提出的建议应该可以正常工作。您必须记住的(这是一个庞大的PITA)是__FILE____DIR__常量将解析符号链接。 PHP绝对无法确定符号链接文件或目录的未解析路径。

为了说明这一点,即使您通过include.php符号链接添加了shadow文件,在该文件中使用__FILE__也会始终返回/skel/include.php

请参阅https://bugs.php.net/bug.php?id=38790