【问题标题】:Safely limiting PHP session space安全地限制 PHP 会话空间
【发布时间】:2016-01-15 03:27:13
【问题描述】:

我似乎无法在任何地方找到此信息,所以我想我在这里问。

目前我将我的 PHP 会话路径 (session.save_path) 设置为服务器硬盘上的一个文件夹。

我创建了一个简单的 PHP 程序,如下所示:

<?php echo "TEST"; ?>

然后我用 strace 执行它,strace 日志中耗时最长的进程是shmdt(),当我匹配数字时,它引用了 session.save_path 中的一个 sem 文件。

我可以尝试缓解此问题的一种方法是为 php 会话文件创建一个 ram 磁盘,但我希望能够向 PHP 配置文件本身添加一个配置条目,以便 PHP 了解它有这么多的空间来在删除旧条目之前使用。

我需要什么配置条目来完成这个?

如果可能,我可以使用哪些配置条目来消除shmdt() 调用?

我在 PHP 5.5.29 版本中测试了我的脚本。

【问题讨论】:

  • “服务器硬盘”是指运行 PHP 的服务器吗?还是在 nfs 文件服务器上?
  • 是的。一切都在服务器上进行了测试,没有连接到任何外部。 (硬盘包含正在运行的 php 文件以及会话文件夹)
  • 您使用的是默认会话处理程序? sem 文件的名称是什么?你在使用 opcache 吗?
  • 实际上,如果这是用shmdt 标记的整个脚本,那么它似乎不太可能与会话相关,因为您实际上并没有开始会话(所以会话不应启动处理支持)。这很奇怪,因为shmdt 只在三个地方使用:opcache,以及 shmop 和 sysvshm 扩展。您是否有机会获得调用 shmdt 的堆栈跟踪?
  • 我根本没有使用 opcache,但我确实安装了 PHP 的 shmop 扩展。这会导致它吗?

标签: php performance session strace


【解决方案1】:

我了解您正在尝试防止会话文件在会话文件夹 (session.save_path) 中过多存储。

如果您有权访问 PHP 配置文件 (php.ini),则必须将“session.gc_maxlifetime”的值调整为所需的最长持续时间,以便从服务器中删除文件。

PHP 文档: http://ar.php.net/manual/en/session.configuration.php#ini.session.gc-maxlifetime

要为“RAM 磁盘”分配空间,需要对服务器进行 root 访问。如果是这种情况,您必须执行以下操作:

  1. 为您的会话创建一个文件夹:
mkdir /var/sessions
  1. 编辑“fstab”文件:
vi /etc/fstab
  1. 创建映射到该文件夹​​的 RAM 磁盘条目:
无 /var/sessions tmpfs defaults,size=50M 1 2
  1. 在“fstab”中保存更改。

  2. 安装新的 RAM 磁盘:

mount -a

注意:在“4”点,我分配了 50 Mb 的 RAM 空间。您必须在服务器 RAM 中分配可供用户使用的空间。

我希望这会有所帮助。

【讨论】:

  • 我的服务器上已经设置了 RAM 驱动器并且处于活动状态。虽然 session.gc_maxlifetime 可能会最大程度地降低超出磁盘空间的风险,但我觉得有一个比冒险更好的答案(如果磁盘使用量超过 x 字节,可能会有某种恐慌/减少文件设置)
猜你喜欢
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
  • 2011-11-06
  • 2011-03-15
  • 2020-04-16
相关资源
最近更新 更多