获取当前php文件的目录,该文件自脚本开始运行后可能已更改

时间:2014-06-04 14:32:05

标签: php linux

我希望你能提供帮助。我需要找到获取当前正在运行的PHP脚本的当前目录的方法。

自脚本启动以来,脚本本身的位置可能已更改。

我不能使用任何魔术常量,例如__FILE____DIR__作为基础,因为它们似乎是在执行开始时由PHP处理器定义的,因此继续指向原始位置脚本。

为了测试想法,我正在执行以下操作(从linux上的命令行):

  1. 在目录test.php中有一个名为test_1的文件,即test_1/test.php
  2. 使用以下命令行在php test_1/test.php
  3. 上运行此文件
  4. 打开另一个终端会话,并使用mv test_1 test_2
  5. 重命名该目录
  6. 密切关注原始终端,希望您能够发现它报告了新的test_2目录而不是test_1
  7. 此测试使用的脚本如下:

    <?php
    while (true) {
        echo "__FILE__: " . __FILE__ . "\n";
        echo "__DIR__: " . __DIR__ . "\n";
        echo "realpath(__FILE__): " . realpath(__FILE__) . "\n";
        echo "realpath(__DIR__): " . realpath(__DIR__) . "\n";
        echo '-----'. "\n";
        sleep(5);
    }
    

    所以,问题是:如何找到当前运行的脚本的当前目录(而不是脚本启动时的位置)?

2 个答案:

答案 0 :(得分:1)

脚本的inode不会更改,即使它被移动到同一文件系统中的其他位置。

您可以使用内置函数getmyinode获取脚本开头的文件的inode和路径名:

<?php 
  $myinode = getmyinode();
  $mypath = realpath(__FILE__);
?>

然后,只要您想获取文件路径,请调用一个比较两者的函数,并在必要时更新路径:

<?php
  function getMyPath() {
    global $myinode, $mypath;
    if (fileinode($mypath) != $myinode) {
      // File moved!
      $searchfrom = '/'; // Maybe you can change this to $_SERVER['DOCUMENT_ROOT']
      $mypath = shell_exec("find " . $searchfrom . " -inum " . $myinode . " -print -quit 2>/dev/null");
      if (fileinode($mypath) != $myinode) {
        // error; not found
      }
    }
    return $mypath;
  }
?>

如果/何时移动文件,搜索inode将会非常慢,但我没有看到任何解决方法。另请注意,如果存在硬链接,则可能存在指向同一文件的多个路径;上面的-print -quit只是在第一个之后停止。

由于使用了inode和find shell命令,这只适用于Linux。

答案 1 :(得分:0)

dirname(__FILE__);

也许这会有所帮助?