我在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
还有其他建议吗?
先感谢您
解决方法:
写会话数据
我也遇到过这个问题:(
不幸的是,我无法弄清楚为什么会这样.它与PHP如何将会话数据与流浪客户中的NFS同步文件夹结合使用有关. (所有其他写操作正常运行,它特定于会话写入.)
我最终通过在同步文件夹之外存储会话来解决这个问题.在我的情况下,我只使用/ tmp.对于流浪客人来说,这样做的安全风险是可以接受的恕我直言,因为它只能在您的本地机器上运行.我不会在真实(生产)服务器上推荐这个,但是你不会有这个问题;)
所有者/团体
文件所有者(502)/组(拨出)&同步文件夹中的目录对于OS X主机上的流浪客户是正常的.
502是OS X主机上用户的uid.该用户将其gid设置为20(工作人员),这对于OS X用户来说是正常的.通过NFS挂载同步文件夹时,同样的uid& gid将出现在流浪客人面前.在那里,uid 502没有映射到用户,这就是为什么502会在你执行ls -l时显示的原因. gid 20映射到组拨出,这就是为什么会显示.
我之所以提到这一点,是因为你可以在互联网上找到很多资源,指出这个“奇怪的”用户/组信息是写问题的根源,但事实并非如此.这根本不是“奇怪的”(但对于OS X主机上的NFS同步文件夹完全正常)并且不会导致写入问题.您可以使用file_put_contents()编写文件这一事实证明了这一点.
不同会话处理程序
默认情况下,PHP将使用session.save_handler指令的值文件,这会导致会话存储在文件系统中.
某些扩展(如Sqlite,Memcached,Redis等)将注册不同的处理程序供您使用.您可以通过将session.save_handler设置为sqlite,memcached,redis等来启用它们.请参阅有关如何配置它们的正确文档.
或者,您可以通过将session.save_handler设置为user来使用自定义处理程序.然后你可以实现你喜欢的任何东西.这是在MySQL数据库中存储会话的常用方法.这些文档应该让你开始:
> Custom Session Handlers
> session_set_save_handler
> session.save_handler