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

Vit*_*ian 3 php ubuntu session nfs vagrant

我在OSX主机上的Vagrant VM中运行Ubuntu 12.04.

这里是用于安装文件夹的Vagrant配置:

config.vm.synced_folder "/var/projects", "/projects", type: "nfs"
Run Code Online (Sandbox Code Playgroud)

我发现PHP无法在NFS共享目录上正确创建会话.

这是test.php脚本:

session_save_path('/projects/sessions');
session_start();

file_put_contents('/projects/sessions/file.txt', 'TEST');
Run Code Online (Sandbox Code Playgroud)

这是执行的输出:

$ 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
Run Code Online (Sandbox Code Playgroud)

以下是执行后发生的情况:

$ 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
Run Code Online (Sandbox Code Playgroud)

如您所见,会话文件为空,并使用奇怪的权限创建.因此,创建txt文件时没有错误.

我试过PHP 5.4和5.5

还有其他建议吗?

先感谢您

Jas*_*wer 5

写会话数据

我也遇到过这个问题:(

不幸的是,我无法弄清楚为什么会这样.它与PHP如何将会话数据与流浪客户中的NFS同步文件夹结合使用有关.(所有其他写操作正常运行,它特定于会话写入.)

我最终通过在同步文件夹之外存储会话来解决这个问题.在我的情况下,我只是使用/tmp.对于流浪客人来说,这样做的安全风险是可以接受的恕我直言,因为它只能在您的本地机器上运行.我不会在真实(生产)服务器上推荐这个,但是你不会有这个问题;)

所有者/团体

同步文件夹中的文件和目录的owner(502)/ group(dialout)对于OS X主机上的流浪客户是正常的.

502是OS X主机上用户的uid.该用户将其gid设置为20(staff),这对OS X用户来说是正常的.通过NFS挂载同步文件夹时,同样的uid&gid将显示在vagcoming guest虚拟机中.那里的uid 502没有映射到用户,这就是502你做什么时会显示的原因ls -l.该GID 20映射到组dialout,所以这就是为什么会显示.

我之所以提到这一点,是因为你可以在互联网上找到很多资源,指出这个"奇怪"的用户/组信息是写问题的根源,但事实并非如此.这根本不是"奇怪"(但对于OS X主机上的NFS同步文件夹完全正常)并且不会导致写入问题.您可以编写文件file_put_contents()证明这一点.

不同会话处理程序

默认情况下,PHP将使用值filessession.save_handler指令,这会导致会话被存储在一个文件系统.

某些扩展(如Sqlite,Memcached,Redis等)将注册不同的处理程序供您使用.你可以通过设置让他们session.save_handlersqlite,memcached,redis等请教关于如何进行配置适当的文件.

或者你也可以通过设置使用自定义处理程序session.save_handleruser.然后你可以实现你喜欢的任何东西.这是在MySQL数据库中存储会话的常用方法.这些文档应该让你开始: