你如何让PHP,符号链接和__FILE__很好地协同工作?

2022-08-30 11:43:39

在本地主机上。我有以下目录结构:

/share/www/trunk/wp-content/plugins/otherfolders

/share/www/portfolio/wp-content/symlink

其中 是 指向 的符号链接。基本上,这是因为我需要测试多个WordPress安装并设置它们,但我不想移动插件并将它们复制并粘贴到任何地方。symlink/trunk/.../plugins/

但是,有时我需要爬行目录树以包含配置文件:

 $root = dirname(dirname(dirname(dirname(__FILE__))));
      if (file_exists($root.'/wp-load.php')) {
          // WP 2.6
          require_once($root.'/wp-load.php');
      }

该文件夹始终解析为:

/share/www/trunk

即使插件正在执行并包含在

/share/www/portfolio/.

在 PHP 中,是否可以在目录中包含从脚本执行到目录的符号链接中的文件?share/www/portfolio/share/www/trunk/.../plugins

虽然这个问题只发生在我的测试服务器上,但我希望有一个安全可分发的解决方案,所以爬升一个额外的级别不是一个选项


答案 1

我看到你的代码的问题是自动解析符号链接。__FILE__

摘自 PHP 魔法常量手册

...从 PHP 4.0.2 开始,始终包含一个解析符号链接的绝对路径...__FILE__

您可以尝试改用。$_SERVER["SCRIPT_FILENAME"]

$root = realpath(dirname(dirname(dirname(dirname($_SERVER["SCRIPT_FILENAME"])))));
  if (file_exists($root.'/wp-load.php')) {
      // WP 2.6
      require_once($root.'/wp-load.php');
  }

请注意,我将函数添加到根目录。根据您的设置,您可能需要也可能不需要它。realpath()

编辑:代替用于文件系统路径。$_SERVER["SCRIPT_FILENAME"]$_SERVER["PHP_SELF"]


答案 2

以下是该问题的解决方案:https://github.com/logical-and/symlink-detective

$root = dirname(dirname(dirname(dirname(__FILE__))));
  if (file_exists(SymlinkDetective::detectPath($root.'/wp-load.php'))) {
      // WP 2.6
      require_once(SymlinkDetective::detectPath($root.'/wp-load.php'));
  }

或者你可以试试

try {
  $root = dirname(dirname(dirname(dirname(__FILE__))));
  require_once SymlinkDetective::detectPath($root.'/wp-load.php', '', 
    false /* this would throw an exception if file doesn't exists */);
}
catch (Exception $e) {
  // nothing to do if file doesn't exists
}

推荐