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

Posted

技术标签:

【中文标题】PHP 在 NFS 共享目录中创建空会话【英文标题】:PHP creates empty session in NFS shared directory 【发布时间】:2014-07-21 10:16:40 【问题描述】:

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

还有其他可以尝试的建议吗?

提前谢谢你

【问题讨论】:

您正在将 nfs 共享映射到 /projects,但将会话保存路径设置为 /project - 这个错字只是在示例中吗? @RobertRossmann 感谢您指出这一点 - 这是一个错字。很抱歉 又一只小猫被救了,谢谢@VitaliyZurian 【参考方案1】:

写入会话数据

我也遇到过这个问题:(

不幸的是,我无法弄清楚为什么会发生这种情况。它与 PHP 如何结合 vagrant guest 中的 NFS 同步文件夹写入会话数据有关。 (所有其他写操作正常,它特定于会话写。)

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

所有者/组

同步文件夹中文件和目录的所有者 (502) / 组 (dialout) 对于 OS X 主机上的 vagrant guest 来说是正常的。

502 是您在 OS X 主机上的用户的 uid。该用户的 gid 设置为 20 (staff),这对于 OS X 用户来说是正常的。通过 NFS 挂载同步文件夹时,相同的 uidgid 将显示在 vagrant guest 中。 uid 502 没有映射到用户,这就是为什么502 会在您执行ls -l 时显示。 gid 20 映射到组 dialout,所以这就是显示的原因。

我之所以提到这一点,是因为您可以在 Internet 上找到很多资源,这些资源指向这个“奇怪”的用户/组信息是写入问题的根源,但它不是。这一点都不“奇怪”(但对于 OS X 主机上的 NFS 同步文件夹来说是完全正常的)并且不会导致写入问题。您可以使用file_put_contents() 编写文件这一事实证明了这一点。

不同的会话处理程序

默认情况下,PHP 将为 session.save_handler 指令使用值 files,这会导致会话存储在文件系统中。

某些扩展(如 Sqlite、Memcached、Redis 等)将注册不同的处理程序供您使用。您可以通过将session.save_handler 设置为sqlitememcachedredis 等来启用它们。有关如何配置它们,请参阅正确的文档。

或者您可以通过将session.save_handler 设置为user 来使用自定义处理程序。然后你可以实现任何你喜欢的东西。这是在 mysql 数据库中存储会话的常用方法。这些文档应该可以帮助您入门:

Custom Session Handlers session_set_save_handler session.save_handler

【讨论】:

感谢您分享您的经验!我正在做同样的解决方法。不过,我仍然对问题的根源感到好奇:) 我认为找出答案的唯一方法是查看 PHP 的内部结构并使用像 strace 这样的工具...【参考方案2】:

我之前遇到过这个问题,我通过更改我的项目目录的权限来解决它。

我相信,如果您更新 vagrantFile 中的驱动器映射行,您的问题就会消失。可以在以下位置找到使用 nfs 进行映射的文档:https://docs.vagrantup.com/v2/synced-folders/nfs.html

【讨论】:

您使用了哪些权限?在主机上还是在来宾上?我应该更新驱动器映射的哪一行? 在您的 vagrantFile 中,它应该是以 'config.vm.synced_folder' 开头的行。需要的参数在下面的文章中有描述:jeremykendall.net/2013/08/09/vagrant-synced-folders-permissions 上面写着shared folders that have NFS enabled do not support owner/group attributes. 奇怪的是这里没有提到:docs.vagrantup.com/v2/synced-folders/nfs.html【参考方案3】:

在 Windows 上,最简单的解决方案是将 php 降级到 5.3,这是 ubuntu 12.04 中的默认版本,它可以正常工作。 在我升级到 5.4 和 5.5 后它停止工作。

另一个解决方法是通过删除 vagrant config 中的 synced_folder 行来禁用共享文件夹,并使用配置文件添加 mount cifs。

mount -t cifs -o username=myusername,password=mypass //192.168.0.88/projects/new_project/public_html/ /home/new_site/public_html/

您必须先在您的主机上创建 smb 共享。

【讨论】:

不可能在windows上使用“NFS”挂载,不是吗? 正确。然而,“vboxsf”安装产生了完全相同的问题。我相信 vbox share 和 php 5.4/5.5 之间的问题是问题所在。你试过5.3吗?它应该可以工作。 感谢您的建议,我会在星期一(2014 年 10 月 27 日)尝试,如果它有效,会通知您。但是,这不是我当前项目的选择:( 你能解决这个问题吗?我遇到了完全相同的问题!

以上是关于PHP 在 NFS 共享目录中创建空会话的主要内容,如果未能解决你的问题,请参考以下文章

检查 NFS 共享是不是在 PHP 中启动

WIN10旗舰版怎么挂载NFS共享目录

WIN10旗舰版怎么挂载NFS共享目录?

Linux上挂载windows共享目录

多节点Tomcat利用NFS服务实现目录共享

Linux网络服务------NFS共享储存服务