PHP 在 NFS 共享目录中创建空 session

标签 php session ubuntu vagrant nfs

我在 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 安装同步文件夹时,相同的 uidgid 将出现在 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 设置为 sqlitememcachedredis 等来启用它们。请查阅适当的文档关于如何配置它们。

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

关于PHP 在 NFS 共享目录中创建空 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24862708/

相关文章:

php - Zend 2 无法连接到数据库

php - 带有 curl --interface 或 CURLOPT_INTERFACE 的 SO_BINDTODEVICE

php - 销毁 session 后重定向到上一页

linux - 授予每个人对此设置的读取权限有哪些安全风险?

c++ - 基于 X.XX 版内核构建的 C++ Linux 应用程序能否在早期版本上运行?

php - 在 Perl 中循环数组构建多维数组,从 PHP 转换,语法错误

php - 如何检查表单中的任何字段是否为空

django - 禁用Django中的 session 创建

PHP:从 session 中获取用户名

编译并执行带参数的c程序