Just buy more RAM
在真正的OSs中,没有“释放”内存这样的事情。一旦为应用程序分配了内存,它就归它所有,不太可能“返回”到操作系统。因此,如果您有一个“泄漏”内存的应用程序,它将在某个时候消耗所有可用的RAM。
web服务器通常处理需要执行PHP代码的请求的方式是派生一个进程来处理它。由于生成进程本身不是一件非常有效的事情,因此它们会在web服务器启动时生成多个进程,并与之通信。这样一个进程可以使用多少内存?如上所述,分配的内存永远不会返回给操作系统,因此最大内存量将是允许PHP使用的最大内存量。
web服务器的开发人员并不完全是白痴,他们知道内存分配的限制,为了解决这个问题,每个PHP处理进程都会在某个时候被杀死,通常是基于用户配置的标准。这减少了所有这些进程一起获得最大内存的机会。
因此,您实际上不需要任何特殊调试来了解如何使用所有RAM。这是一个简单的公式(PHP处理进程的数量)*(PHP可以分配的最大内存)。如果结果远远高于物理RAM,那么您就有麻烦了。
如何修复?您可以将web服务器配置为具有较少的PHP处理程序。这将降低web服务器在负载下的响应能力,因为进程必须在开始处理新请求之前完成它所做的任何事情。或者您可以降低PHP的最大内存设置,但由于您已经消耗了所有RAM,这可能还不够,因为这不是核心问题(而是进程的数量),否则某些地方会出现问题。
在继续之前,我是否已经说过just buy more RAM
达到最大RAM表示服务器设置不好或软件设计不好。
第一个问题很容易解决,最坏的情况下,这意味着你处理的流量比你预期的要多,如果你真的赚到了钱,这是一件好事。
第二个问题是你不太可能解决的。您不能花费数年的开发时间来忽视将PHP内存限制在最低限度的最佳实践,并通过提高限制来修复内存问题,而希望在一个月内重构代码而不破坏任何东西(特别是因为该站点不太可能有任何自动或甚至手动测试计划来验证没有任何东西被破坏)。
忽视软件开发最佳实践以达到“演示”阶段是很酷的,在这个阶段,您可以评估在项目上投入更多精力是否值得,继续使用那些页面生成器和ACF以及任何其他RAD垃圾作为最终产品的基础是不酷的,或者,至少如果你喜欢这样做,你需要明白,迟早你会不得不这样做的buy more RAM. 老实说,虽然我个人不喜欢页面生成器、ACF等,但如果你的网站不会增长太多,那么在需要时购买更多RAM可能是更具成本效益的解决方案。