由于 PHP 会话导致磁盘 inode 已满

由于 PHP 会话导致磁盘 inode 已满

我们已经为这个问题苦苦挣扎了两年多。我们有一个电子商务商店,使用 PHP 会话来存储用户购物篮和其他信息。问题是,一段时间后,即使服务器磁盘上有足够的可用空间,服务器也会用尽磁盘 inode。然后它会崩溃整个服务器,因为我们无法在磁盘上写入任何内容。

我们多次向服务器管理公司反映这个问题,但他们的答复是删除一些会话以释放 inode。问题是,每次我们这样做,客户就会丢失他们的购物篮。

解决此问题的解决方案是什么?将 PHP 会话写入数据库需要进行大量代码更改,并且如果不从其他服务器重新开始,我们就无法增加 inode 数量。

我们已经有一个 cron 作业来删除上个月未修改的会话文件,但这还不够,而且随着网站的不断发展,inodes 问题发生得更频繁。

答案1

从系统角度来看,在实际硬件上,解决方案是创建一个具有不同inode_ratio或甚至是新的 FS 类型的新文件系统,该文件系统是围绕大量小文件设计的。如果您的托管服务提供商是基于云的,而不是共置硬件或“专用” VPS,则您的托管服务提供商可能会或可能不会提供此功能。 参见下面的编辑

如果您可以更改购物系统的代码,则应将已登录用户的购物车存储在数据库中,并让会话正常过期,然后清理旧的会话文件。会话的生命周期应该相对较短,并且应定期清理/删除旧的非活动会话的会话文件。

将信息存储在数据库中有很多优势 - 既有技术优势(更容易在 CDN 上分担 Web 服务器负载),也有商业优势(“嘿,您已经将此商品放在愿望清单中一段时间​​了,现在它快缺货了 - 立即购买!”电子邮件让我不止一次打开钱包),这就是我要走的方向。但至少要开始删除旧的过期会话文件……

编辑以添加 -

获取新 FS 的一个巧妙方法是创建一个适当大小的稀疏文件,使用所选的文件系统对其进行格式化,然后将其挂载到环回设置上。当然,您需要足够的空间等才能做到这一点……

答案2

Zebra Session 充当 PHP 默认会话处理函数的包装器,但它不是将会话数据存储在平面文件中,而是将其存储在 MySQL 数据库中,从而提供更好的安全性和更好的性能

它是 PHP 默认会话处理程序的嵌入式无缝替代品:PHP 会话的使用方式与使用该库之前相同;您无需更改任何现有代码!

https://github.com/stefangabos/Zebra_Session

正是我要找的东西。

另一个解决方案:https://stackoverflow.com/questions/36753513/how-do-i-save-php-session-data-to-a-database-instead-of-in-the-file-system

答案3

应该可以将 PHP 会话文件迁移到新服务器。

这假设值得努力迁移到一台新的服务器,该服务器拥有可以在可接受的时间内应对预期流量增长的资源(inode)。

会话文件存储在session.save_path的设置中php.ini

相关内容