在我的Windows 8上,我安装了VirtualBox + Vagrant。我用Laravel Homestead (with Ubuntu)作为框。在此VM或运行命令行上运行站点时,我预计它将在Linux上运行,而不是在Windows上运行。但我发现了一些奇怪的问题:
首先是我的文件夹映射:
folders:
- map: D:\DaneAplikacji\easyphp\data\localweb\projects\testprovag\strony
to: /home/vagrant/code
sites:
- map: learn.app
to: /home/vagrant/code/my-first-app/public
当我在浏览器http://learn.app:8000
中运行时,我得到了正确的输出 - 来自/home/vagrant/code/my-first-app/public
的页面与D:\DaneAplikacji\easyphp\data\localweb\projects\testprovag\strony\my-first-app/public
中的代码相同,只是为了清楚。
现在出现问题:
在我的public
文件夹中,我创建了2个简单文件:
名称为test
的文件(文件为空)和文件index.php
包含内容:
<?php
if (file_exists('TEST')) {
echo "file exists";
}
else {
echo "file NOT exists";
}
现在我在浏览器中运行http://learn.app:8000
,然后输出file exists
。这是我不能期待的结果。据我所知,在Linux(我的盒子是Ubuntu)中你可能有不同名称的文件(与Windows相反),所以我希望得到file NOT exists
。
我已经在运行php index.php
的虚拟机中对其进行了测试,我得到完全相同的结果file exists
又出乎意料。
现在我做了什么,我将这两个文件复制到我的VM /home/vagrant/TESTS
上的其他目录 - 这个目录没有使用Vagrant进行映射。现在,当我运行php index.php
时,我得到了file NOT exists
预期结果。
说实话,我完全不了解它。 问题 - 在使用Vagrant映射操作VM文件系统(在本例中为Ubuntu)或Virtual BOX主机文件系统(在我的情况下为Windows)时使用PHP。有没有办法让它能够达到预期的效果?我知道这个问题可能与软件有关,但它真的与PHP和Laravel有关,也许我想念这里。
答案 0 :(得分:4)
我认为这个问题可以在不使用Samba或太多工作的情况下解决。
在Windows cmd
中,我运行:
vagrant plugin install vagrant-winnfsd
它安装了plugin for NFS for Windows,虽然在http://docs.vagrantup.com/v2/synced-folders/nfs.html您可以清楚地知道NFS对Windows不起作用:
Windows用户:NFS文件夹在Windows主机上不起作用。 Vagrant将忽略您在Windows上对NFS同步文件夹的请求。
我修改了Homestead.yaml
文件映射:
folders:
- map: D:\DaneAplikacji\easyphp\data\localweb\projects\testprovag\strony
to: /home/vagrant/code
为:
folders:
- map: D:\DaneAplikacji\easyphp\data\localweb\projects\testprovag\strony
to: /home/vagrant/code
type: "nfs"
(可能如果不使用Homestead.yaml,您可以添加type: nfs
,类似config.vm.synced_folder ".", "/vagrant", type: "nfs"
中的Vagrantfile
现在我跑
vagrant up
我收到2或3个管理员密码通知(可能是NFS的一些Windows配置 - 它只会在我添加NFS类型后首先运行vagrant up
时出现)但现在两者都使用url http://learn.app:8000
我来自问题file NOT exists
的情况和我在框命令行中运行php index.php
时的情况相同。
注意:此解决方案无法让您在同一目录中创建test
和TEST
文件,您将在文件系统中使用它们。它似乎以区分大小写的方式处理文件,因此如果您在应用程序中创建了一个错误的文件(以及稍后在您的代码中要加载它/ require),您会注意到它不会对您的Vagrant起作用Linux盒子(它可以在Windows WAMP上运行,在开始生产时你会感到惊讶)。
答案 1 :(得分:1)
使用默认的vagrant共享,您使用仍由基础文件系统提供的已安装文件夹。它也不会正确处理Linux ACL。
我们发现的一个解决方案是,不是与客户端共享主机的文件夹,而是在guest虚拟机上设置samba并将其共享回主机。它更麻烦,你必须做更多的配置,但至少你的app应该在一个环境中运行
答案 2 :(得分:1)
有趣。我将Windows 7与Homestead一起使用 - 我还假设案例敏感性文件问题将由Vagrant处理。但是我运行了一些类似的测试 - 而且你是对的 - 它实际上是不区分大小写的。
我可以确认这个问题与PHP根本没有关系 - 问题实际上发生在命令行本身的Vagrant中:
touch EXAMPLE
rm example
当我进入SSH时,它会传递给Vagrant框。但是在一个真正的Ubuntu盒子上(我在我的服务器上测试过它) - 该命令失败了。
原因是Vagrant正在调用Windows以检查映射文件夹的文件是否存在。但是如果你在Vagrant中创建一个虚拟的非映射文件夹 - 那么就打电话给&#39;查看文件是否存在仍然在Vagrant内部,因此只能由Ubuntu处理 - 这就是你的其他测试通过的原因。
我尝试将Windows 7的案例敏感度打开为documented here - 但它没有解决问题