memory_limit 在 PHP 中是如何工作的?

Iva*_*ova 3 php

如果我有两个脚本并且我的memory_limit选项设置为64M(例如)。如果我运行脚本 1 并且它需要40M并同时运行脚本 2 它有多少可用内存?

每个脚本是否有高达64M或它们共享此内存?

Pis*_*3.0 8

每个独立运行的 PHP 脚本都有自己的内存限制(由配置选项memory_limit 设置)。此限制继承到所有包含的脚本中(因为这些脚本依赖于父脚本)。

一个例子 - 两个并行运行的脚本:

  • 你打开一个网页 /script1.php
  • 你也打开了一个网页 /script2.php

由于这两个是完全独立的(没有简单的方法可以发现“另一个脚本”正在运行,或者甚至它存在),它们每个都会得到 64M 的限制——所以它们被允许使用的内存量为 64M一个,两个的结果是 128M。(澄清一下,不可能在脚本之间“共享”这个内存:如果 script1.php 只消耗 1MB,它不能“给”script2.php 其余的限制)

一个不同的场景 - 一个脚本包括另一个脚本:

  • 你打开一个网页 /script1.php
    • 该脚本有一行 require('script2.php')

在这种情况下,只有一个 64MB 的限制:这仍然被视为单个脚本,无论它包含多少个文件 ()s 或 require()s。换句话说,script2.php继承限制(以及其他 PHP 设置),script1.php并且此处使用的所有内存都计入该限制。

请注意,可以从脚本内部更改此限制(如果您的服务器配置允许 - 大多数情况下)。使用ini_set('memory_limit', '128M');将新限制设置为 128 MB - 但到目前为止脚本使用的所有内存仍计入此限制。

包括其他脚本和动态更改内存限制的脚本:

  • 您打开网页/script1.php(在 script1.php 中,从配置中设置限制为 64 MB)
    • 运行require('script2.php')(在 script1.php 中,限制 64 MB 继承)
      • 运行ini_set('memory_limit','200MB')(在 script2.php 中,明确更改为 200 MB)
      • 运行require('script3.php')(在 script2.php 中,限制为 200 MB,如上所述)
        • 运行require('script4.php')(在 script3.php 中,限制 200 MB 继承)
          • 运行ini_set('memory_limit','-1')(在script4.php中,明确更改为“无限制”)
          • 运行require('script5.php')(在script4.php中,继承了“无内存限制”)

注意:可以设置比当前更低的限制,但这有可能立即超出它(“我们正在使用 80 MB” - “将限制设置为 64 MB” - “内存不足错误”);由于这种风险,很少有人尝试这样做。

还要注意,这memory_limit是一个配置设置,因此它可以在不同的地方设置;或者它的修改可以被系统管理员阻止