内存限制在PHP中是如何工作的?

内存限制在PHP中是如何工作的?,php,Php,如果我有两个脚本,并且我的内存限制选项设置为64M(例如)。如果我运行脚本1,它需要40M并同时运行脚本2,它有多少可用内存 每个脚本都有多达64M的内存吗?每个独立运行的PHP脚本都有自己的内存限制()。此限制继承到所有包含的脚本中(因为这些脚本依赖于父脚本) 一个示例-两个并行运行的脚本: 打开一个网页/script1.php 您还可以打开一个网页/script2.php 由于这两个脚本是完全独立的(没有简单的方法可以发现“另一个脚本”正在运行,甚至它的存在),它们将各自获得64M的限制

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


每个脚本都有多达64M的内存吗?

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

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

  • 打开一个网页
    /script1.php
  • 您还可以打开一个网页
    /script2.php
由于这两个脚本是完全独立的(没有简单的方法可以发现“另一个脚本”正在运行,甚至它的存在),它们将各自获得64M的限制-因此它们允许使用的内存量为64M(一个为64M),而两个为128M。(为了澄清,不可能在脚本之间“共享”此内存:如果script1.php仅消耗1MB,则无法将其剩余的限制“给予”script2.php)

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

  • 打开一个网页
    /script1.php
    • 该脚本有一行
      require('script2.php')
在本例中,只有一个64MB的限制:无论它包含多少个文件()s或需要多少个文件(),这仍然被视为一个脚本。换句话说,
script2.php
script1.php
继承限制(以及其他php设置),并且此处使用的所有内存都计入该限制

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

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

  • 打开网页
    /script1.php
    (在script1.php中,从配置中限制64 MB)
    • 运行
      require('script2.php')
      (在script1.php中,继承的限制为64 MB)
      • 运行
        ini\u集('memory\u limit','200MB')
        (在script2.php中,显式更改为200MB)
      • 运行
        require('script3.php')
        (在script2.php中,如上所述限制200 MB)
        • 运行
          require('script4.php')
          (在script3.php中,继承的限制为200 MB)
          • 运行
            ini\u集('memory\u limit','-1')
            (在script4.php中,显式更改为“no limit”)
          • 运行
            require('script5.php')
            (在script4.php中,继承了“无内存限制”)

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

还要注意,
内存限制
是一种配置设置,因此可以进行设置;也可以由系统管理员对其进行修改。

来自PHP手册:

这将设置脚本使用的最大内存量(以字节为单位) 允许分配。这有助于防止编写错误的脚本 耗尽服务器上的所有可用内存。请注意,没有 内存限制,将此指令设置为-1


这意味着每个脚本获得相同的6400万内存。

内存限制是每个脚本可以分配的最大内存量。我想问你一个关于它如何工作的问题。我有一个由我们团队定制的框架。我们在一个有256MB内存限制的站点上使用它,我们的服务器有24GB的RAM,这是否意味着我们的服务器可以处理大约256*4*24的同时连接?我的意思是,该限制适用于站点的每个访问者,还是apache如何计算该限制?该限制适用于每个正在运行的PHP脚本(例如,如果访问者当前加载了五个页面,则该访问者当前的最大使用量为5*256):如果脚本尝试分配更多内存,它将失败-但是服务器不会分配内存,除非脚本确实需要它。请注意,除了PHP之外,服务器上还运行其他东西,因此您自己没有完整的24GB。此外,这是脚本可以获得的最大值-大多数脚本的请求远远小于最大值。