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

时间:2014-07-21 10:16:40

标签: php session ubuntu vagrant 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

还有其他建议吗?

提前谢谢

3 个答案:

答案 0 :(得分:5)

写会话数据

我也遇到过这个问题:(

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

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

所有者/团体

文件所有者(502)/群组(dialout)&同步文件夹中的目录对于OS X主机上的流浪客户来说是正常的。

502是OS X主机上用户的 uid 。该用户将 gid 设置为20staff),这对于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设置为sqlitememcachedredis等来启用它们。请参阅有关如何配置它们的正确文档。

或者,您可以将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共享。