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

时间:2018-11-20 15:41:27

标签: php docker windows-10 samba 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));

如果在容器内执行,则仅输出demo-base-directory,但是缺少demo-symbolic-link(该示例在Docker容器内的Linux / Unix系统上可以正常工作)

array(1) {
  [0]=>
  string(19) "demo-base-directory"
}

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

XSym
0019
0df68e8650ddca993c28277a5cfa3dcd
demo-base-directory

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

共享卷通过Samba / CIFS挂载在Windows主机系统上的基于Linux的Docker容器中挂载,如下所示:

  在/ var / www / html类型CIF上

// 10.0.75.1/C   (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 symlinks

解决方法

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

使用普通mklink in cmd.exe

del demo-symbolic-link
mklink /d demo-symbolic-link demo-base-directory

输出

symbolic link created for demo-symbolic-link <<===>> demo-base-directory

在PowerShell中通过cmd使用普通的mklink

del demo-symbolic-link
cmd /c mklink /d demo-symbolic-link demo-base-directory

输出

symbolic link created for demo-symbolic-link <<===>> demo-base-directory

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

在Windows上使用Git-Bash

以管理员身份执行Git-Bash时,我必须执行以下命令。在此处使用export设置环境变量很重要-请参见Enable native NTFS symbolic links for Cygwin

rm demo-symbolic-link
export MSYS=winsymlinks:nativestrict
ln -s demo-base-directory/ demo-symbolic-link

助手工具

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

结果

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

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

问题

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

这似乎可以在不同的层次上解决:


更新

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

1 个答案:

答案 0 :(得分:2)

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