我在 OSX 主机上的 Vagrant 虚拟机中运行 Ubuntu 12.04。
这里是用于挂载文件夹的 Vagrant 配置:
config.vm.synced_folder "/var/projects", "/projects", type: "nfs"
我发现 PHP 无法在 NFS 共享目录上正确创建 session 。
这是 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
如您所见, session 文件是空的,并且是使用奇怪的权限创建的。因此,创建的 txt 文件没有错误。
我试过 PHP 5.4 和 5.5
还有其他尝试的建议吗?
提前致谢
最佳答案
写入 session 数据
我也遇到过这个问题:(
不幸的是,我无法弄清楚为什么会这样。它与 PHP 如何结合 vagrant guest 中的 NFS 同步文件夹写入 session 数据有关。 (所有其他写入操作正常运行,它特定于 session 写入。)
我最终通过将 session 存储在同步文件夹之外解决了这个问题。在我的例子中,我只是使用了 /tmp
。对于一个 Vagrant 的客人来说,这样做的安全风险是可以接受的恕我直言,因为它只在你的本地机器上运行。虽然我不建议在真实(生产)服务器上这样做,但你不会有这个问题;)
所有者/组
同步文件夹中文件和目录的所有者 (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()
编写文件这一事实证明了这一点。
不同的 session 处理程序
默认情况下,PHP 将为 session.save_handler
指令使用值 files
,这会导致 session 存储在文件系统中。
某些扩展(如 Sqlite、Memcached、Redis 等)会注册不同的处理程序供您使用。您可以通过将 session.save_handler
设置为 sqlite
、memcached
、redis
等来启用它们。请查阅适当的文档关于如何配置它们。
或者您可以通过将 session.save_handler
设置为 user
来使用自定义处理程序。然后你可以实现任何你喜欢的东西。这是在 MySQL 数据库中存储 session 的常用方法。这些文档应该可以帮助您入门:
关于PHP 在 NFS 共享目录中创建空 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24862708/