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 挂载同步文件夹时,相同的 uid 和 gid 将显示在 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
设置为sqlite
、memcached
、redis
等来启用它们。有关如何配置它们,请参阅正确的文档。
或者您可以通过将session.save_handler
设置为user
来使用自定义处理程序。然后你可以实现任何你喜欢的东西。这是在 mysql 数据库中存储会话的常用方法。这些文档应该可以帮助您入门:
【讨论】:
感谢您分享您的经验!我正在做同样的解决方法。不过,我仍然对问题的根源感到好奇:) 我认为找出答案的唯一方法是查看 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 共享目录中创建空会话的主要内容,如果未能解决你的问题,请参考以下文章