PHP and Symlinks in Windows


PHP and Symlinks in Windows

我有一个带有符号链接的目录树。它们用require_once调用,但有时用'm',有时用'mydir'。'm'和'mydir'是符号链接的,但是当require_once被调用两次时,它会将它们视为不同的文件并导致代码错误。

require_once("m/myfile.php");
require_once("mydir/myfile.php);

我只希望文件包含一次,但它试图做两次

几年后,在windows 10系统下,我遇到了类似的问题:

  • 我通过git签出了我们的项目,符号链接在git
  • 项目中使用了一些目录符号链接
  • Apache和bash在windows下工作,生成的符号链接没有任何问题
  • PHP, Windows资源管理器和CMD无法处理符号链接

问题是,符号链接是作为"文件"符号链接创建的,但指向的是目录。在删除符号链接并使用

手动重新创建它们之后
mklink /D link target

一切正常

Windows中没有符号链接,对不起。

如果您已经从github上签出或下载了代码,然后将其放到NTFS文件系统中,那么您的下载程序可能会创建两次文件,一次用于链接,一次用于链接文件。我经常看到这个

我将使用我自己的require函数/自动加载,如果完全OO http://php.net/manual/en/language.oop5.autoload.php,或修复路径函数。

//custom require
function myRequireOnce($filePath)
{//ensure only one version of sym path is ever used
  $filepath = str_replace('mydir', 'm' , $filepath); //possibly too simple
  require_once($filepath);
}
//fix path function
_fp($path)
{
  return str_replace('mydir', 'm' , $filepath);
}
require_once(_fp("m/myfile.php"));

在所有情况下,目标是确保实际上只需要一个路径,并且在替代版本上进行转换。