PHP在NFS共享目录中创建空会话

我在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

上一篇:linux – 当“vagrant up”时它说“看起来你的机器不支持NFS”(Debian jessie)


下一篇:python学习===判断两个日期的间距天数