【问题标题】:Is the more the better for PHP memory_limit? [closed]PHP memory_limit 越多越好吗? [关闭]
【发布时间】:2012-10-03 05:35:39
【问题描述】:

在 PHP 中,我经常遇到内存限制问题。尤其是像 Drupal 等高度资源集成的系统。

这里我想知道的是:

  • php 内存限制很高,比如 2GB 好不好?
  • 有什么主要缺点吗?

已编辑:

作为一个场景,例如在 Drupal 中,它需要大量内存,而我们 通过 Web 面板清除缓存(不是通过 Drush 或任何脚本)。所以即使对于 仅限这种情况,我目前肯定需要大约 512MB 的上限。

【问题讨论】:

  • 一句话,没有。您的内存限制应在您需要的范围内尽可能低地设置。内存限制适用于每个同时执行的脚本,而不是全局。将其设置为低将有助于确保如果您犯了一些错误,例如一个无限循环,脚本将被提前终止,而不是失去控制并让整个服务器停止运行。
  • 服务 100 个并发请求需要多少内存? 200GB?
  • @JvdBerg 内存限制没有定义实际使用了多少内存。这只是单个进程允许使用的限制。
  • 请编辑我的问题。 So oh god!!! now my system is slowing down because of that limit??? (only for Clearing the Cache Process apparently)
  • @4lvin memory_limitPHP_INI_ALL 可变的,所以如果您有一个需要 512MB 的特定脚本,请在脚本顶部调用 ini_set('memory_limit', '512M');

标签: php performance memory memory-limit


【解决方案1】:

黄金法则:只为 PHP 提供 PHP 需要工作的部分,仅此而已。

这将防止您的系统不必要地阻塞 PHP 进程的情况,并且还将帮助您发现错误(占用 1GB 内存的脚本是不寻常的,并且提供 2GB 的内存限制将隐藏这一点)。


对于特殊情况,如果您知道单个脚本文件占用大量内存,您可以使用ini_set() 在运行时更改内存限制指令。请参阅 thisthis

【讨论】:

  • EDITED MY QUESTION PLEASE. 所以天啊!!!现在我的系统因为这个限制而变慢??? (显然仅用于清除缓存进程)@_@
  • 谢谢。你甚至解决了两个问题;)
【解决方案2】:

不,不是越多越好。 这是一个 single 脚本允许使用的内存量。如果您的服务器包含 4GB 内存,那么只有两个脚本同时可以吃掉所有内存。

一般来说,PHP 脚本应该使用很少的内存。通常,脚本在终止时保留的所有内存都会被释放,但您可以在此之前通过显式unsetting 执行期间不再需要的变量来清理内存。这样,您可以使您的脚本更节省内存。

【讨论】:

  • unset() 通常不需要,只要您不会一直使用全局变量。
  • @KingCrunch 即使这样也不应该有所作为吧? global 在脚本执行范围内仍然是全局的,它们不会在请求之间持续存在。另请注意,unset() 不保证内存会立即释放,您还必须调用gc_collect_cycles()
  • EDITED MY QUESTION PLEASE. 所以天啊!!!现在我的系统因为这个限制而变慢??? (显然仅用于清除缓存进程)@_@
  • @DaveRandom 哦...好吧,a) 全局变量保持它们的引用直到脚本被终止(显然),但是 local 变量在你离开本地的那一刻就没有被引用范围。如果您不使用全局变量,则不需要unset(),因为您只设置了您需要的变量(这更多是经验法则,当然不是一种法律等)b)gc_collect_cycles()仅触发循环引用GC,而不是常规GC,但无论如何您都不需要关心,因为它经常运行;)
  • @KingCrunch Yeh 抱歉,我完全误解了你的意思,我以为你在谈论脚本执行的范围,但你在谈论给定代码行的范围,这更有意义.我的印象是gc_collect_cycles() 只是强制 GC 完全运行,而不是仅部分运行。整个全局变量有点争议,因为众所周知,全局变量是邪恶的...
【解决方案3】:

如果您知道有脚本需要大量内存,那么将限制设置为高是完全安全的,并且需要。如果系统的可用内存量和其他正在运行的应用程序的限制设置得太高,则可能会出现问题。

另外请记住,如果内存限制为 64 MB 或类似的东西,可能会以无限循环处理某些数据的错误脚本通常会很快停止。在这种情况下,将内存限制设置为 4 GB 会使系统在无限循环中全速运行更长的时间,并可能导致整个系统变得无响应。

但我有大型数据处理应用程序,其内存限制约为 2-4 GB,在具有 4-8 GB 内存的系统上没有任何问题。请注意,正如其他用户所述,这些应用程序是一个实例。如果您的应用程序运行多个脚本实例(就像大多数 Web 应用程序一样),您将在每个实例中使用大量内存,从而遇到重大问题。您将耗尽内存,并且在释放内存之前,其他客户端将无法使用您的应用程序。

但不要只是提高内存限制来隐藏问题。检查为什么您的应用程序需要这么多内存,看看您是否可以先解决这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-22
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    相关资源
    最近更新 更多