我在OSX主机上的Vagrant VM中运行Ubuntu 12.04。
这是用于安装文件夹的Vagrant配置文件:
config.vm.synced_folder "/var/projects", "/projects", type: "nfs"
我发现PHP无法在NFS共享目录上正确创建会话。
以下是test.php
脚本:
session_save_path('/projects/sessions');
session_start();
file_put_contents('/projects/sessions/file.txt', 'TEST');
以下是执行的输出:
$ php test.php
PHP Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/project/sessions) in Unknown on line 0
以下是执行后会发生的事情:
$ ls -l
total 8
-rw------- 1 502 dialout 0 Jul 21 10:13 sess_0p6bt4g3o0sofi3b7p6016jtg7
-rw-rw-r-- 1 502 dialout 4 Jul 21 10:13 file.txt
-rw-rw-r-- 1 502 dialout 164 Jul 21 10:12 test.php
如您所见,会话文件为空,并使用奇怪的权限创建。因此,创建txt文件时没有错误。
我尝试过使用PHP 5.4和5.5
还有其他建议吗?
提前谢谢
答案 0 :(得分:5)
我也遇到过这个问题:(
不幸的是,我还没有弄清楚为什么会这样。它与PHP如何将会话数据与流浪客户中的NFS同步文件夹结合使用有关。 (所有其他写操作正常运行,它特定于会话写入。)
我最终通过在同步文件夹之外存储会话来解决问题。就我而言,我只使用了/tmp
。对于流浪客人来说,这样做的安全风险是可以接受的恕我直言,因为它只能在您的本地机器上运行。我不会在真实(生产)服务器上推荐这个,但是你没有遇到这个问题;)
文件所有者(502
)/群组(dialout
)&同步文件夹中的目录对于OS X主机上的流浪客户来说是正常的。
502
是OS X主机上用户的 uid 。该用户将 gid 设置为20
(staff
),这对于OS X用户来说是正常的。通过NFS挂载同步文件夹时,同样的 uid & gid 将出现在流浪客人身上。那里 uid 502
没有映射到用户,这就是502
执行ls -l
时显示的原因。 gid 20
已映射到论坛dialout
,以便显示原因。
我之所以提到这一点,是因为你可以在互联网上找到很多资源,指出这个"奇怪的"用户/组信息是写入问题的来源,但它不是。这不是"奇怪"完全(但对于OS X主机上的NFS同步文件夹完全正常)并且不会导致写入问题。您可以使用file_put_contents()
编写文件这一事实证明了这一点。
默认情况下,PHP将使用值files
作为session.save_handler
指令,这会导致会话存储在文件系统中。
某些扩展(如Sqlite,Memcached,Redis等)将注册不同的处理程序供您使用。您可以通过将session.save_handler
设置为sqlite
,memcached
,redis
等来启用它们。请参阅有关如何配置它们的正确文档。
或者,您可以将session.save_handler
设置为user
来使用自定义处理程序。然后你可以实现你喜欢的任何东西。这是在MySQL数据库中存储会话的常用方法。这些文档可以帮助您入门:
答案 1 :(得分:0)
之前我遇到过这个问题,我通过更改项目目录的权限解决了这个问题。
我相信如果你更新vagrantFile中的驱动器映射行,你的问题就会消失。可以在以下位置找到使用nfs进行映射的文档:https://docs.vagrantup.com/v2/synced-folders/nfs.html
答案 2 :(得分:0)
在Windows上,最简单的解决方案是将php降级到5.3,这是ubuntu 12.04中的默认版本,它没有任何问题。 升级到5.4和5.5后,它停止工作。
另一种解决方法是通过删除vagrant配置中的synced_folder行并使用配置文件添加mount cif来禁用共享文件夹。
mount -t cifs -o username=myusername,password=mypass //192.168.0.88/projects/new_project/public_html/ /home/new_site/public_html/
您必须先在主机上创建smb共享。