一尘不染

如何使PHP,Symlinks和__FILE__一起良好地工作?

linux

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

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

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

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

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

 $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目录中?

尽管此问题仅在我的测试服务器上发生,但我想拥有一个可安全分发的解决方案,因此 无法选择额外的级别


阅读 224

收藏
2020-06-02

共1个答案

一尘不染

我在您的代码中看到的问题是__FILE__自动解决符号链接。

摘自PHP MagicConstants手册

从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"]文件系统路径。

2020-06-02