我们已经为这个问题苦苦挣扎了两年多。我们有一个电子商务商店,使用 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
正是我要找的东西。
答案3
应该可以将 PHP 会话文件迁移到新服务器。
这假设值得努力迁移到一台新的服务器,该服务器拥有可以在可接受的时间内应对预期流量增长的资源(inode)。
会话文件存储在session.save_path
的设置中php.ini
。