XSym符号链接不能在Windows的Docker上的PHP中使用

Oli*_*der 5 php samba docker windows-10 ddev

在Windows的Docker容器内使用PHP(例如,使用DDEV)时,在容器内创建的符号链接(例如,由作曲家使用)似乎不适用于PHP的文件流。

情境

想象下面的PHP代码

<?php
mkdir('demo-base-directory');
symlink('demo-base-directory', 'demo-symbolic-link');
var_dump(glob('demo-*', GLOB_ONLYDIR));
Run Code Online (Sandbox Code Playgroud)

如果在容器内执行,则仅输出demo-base-directory,但是demo-symbolic-link会丢失(该示例在Docker容器内的Linux / Unix系统上按预期工作)

array(1) {
  [0]=>
  string(19) "demo-base-directory"
}
Run Code Online (Sandbox Code Playgroud)

当查看主机系统中的符号链接时(例如cat demo-symbolic-link在Windows PowerShell中使用),它显示

XSym
0019
0df68e8650ddca993c28277a5cfa3dcd
demo-base-directory
Run Code Online (Sandbox Code Playgroud)

Docker for Windows还有其他关于符号链接仿真的报告-我无法使用fgetsfile_get_contents而是针对提到的glob调用为文件重现此行为,请参见

共享卷安装在Windows主机系统上的基于Linux的Docker容器中,安装方式为Samba / CIFS,如下所示:

/ var / www / html上的//10.0.75.1/C类型cifs(rw,relatime,vers = 3.02,sec = ntlmsspi,cache = strict,用户名= olly,domain = OLIVERHADERB9D8,uid = 0,noforceuid,gid = 0 ,noforcegid,addr = 10.0.75.1,file_mode = 0755,dir_mode = 0777,iocharset = utf8,nounix,serverino,mapposix,nobrl,mfsymlinks,noperm,rsize = 1048576,wsize = 1048576,echo_interval = 60,actimeo = 1)

挂载选项mfsymlinks是指Minshall + French符号链接

解决方法

不用在容器内部创建符号链接,而是在外部(直接在Windows中)创建它们可以解决问题。

在cmd.exe中使用纯mklink

del demo-symbolic-link
mklink /d demo-symbolic-link demo-base-directory
Run Code Online (Sandbox Code Playgroud)

输出

symbolic link created for demo-symbolic-link <<===>> demo-base-directory
Run Code Online (Sandbox Code Playgroud)

在PowerShell中通过cmd使用纯mklink

del demo-symbolic-link
cmd /c mklink /d demo-symbolic-link demo-base-directory
Run Code Online (Sandbox Code Playgroud)

输出

symbolic link created for demo-symbolic-link <<===>> demo-base-directory
Run Code Online (Sandbox Code Playgroud)

旁注:New-Item -ItemType SymbolicLink无法使用glob(..., GLOB_ONLYDIR in PHP-也使用mklink /d此处解决

在Windows上使用Git-Bash

我必须以管理员身份执行Git-Bash时执行以下命令。在export此处设置环境变量很重要-请参阅为Cygwin启用本机NTFS符号链接

rm demo-symbolic-link
export MSYS=winsymlinks:nativestrict
ln -s demo-base-directory/ demo-symbolic-link
Run Code Online (Sandbox Code Playgroud)

辅助工具

我创建了帮助程序工具示例,这些示例XSym在特定目录(与TYPO3相关的目录public/typo3conf/ext/)中搜索Samba 指针,并将XSym指针“升级”到正确的符号链接-执行这些脚本时可能需要管理员权限:

结果

现在再次从上面执行PHP示例可以输出两个预期的项目

array(2) {
  [0]=>
  string(19) "demo-base-directory"
  [1]=>
  string(18) "demo-symbolic-link"
}
Run Code Online (Sandbox Code Playgroud)

在Docker容器内工作并必须在主机系统上手动调整符号链接实际上只是一种解决方法-并非解决方案。为了仅使用Docker容器创建正确的符号链接,可以在哪个级别进行增强和优化?

看来这可以在不同的层次上解决:


更新

  • mklink /j(结点)切换到mklink /d(符号链接目录),因为删除链接结点也删除了它的起源
  • 然后再次无法在PHP中使用PowerShell的symlink cmdlet New-Item -ItemType SymbolicLink(而不是以前的New-Item -ItemType Junction)来解析glob(..., GLOB_ONLYDIR-结果,使用cmd /c mklink /d此处
  • 添加了Samba / CIFS安装信息

rfa*_*fay 2

从 ddev v1.5.0 开始,ddev composerWindows 上的命令尝试将 XSym 符号链接转换为合法的 Windows 符号链接。仅当您在 Windows 上启用了“开发人员模式”时,此功能才有效。请参阅文档中的Windows 操作系统和 ddev Composer