PHP是否根据其限制动态处理内存使用?

PHP是否根据其限制动态处理内存使用?,php,memory,memory-management,Php,Memory,Memory Management,我有一个脚本,在大约25秒的运行时间内,当PHP的内存限制设置为50M时,它会成功运行。当我在脚本末尾打印memory\u get\u peak\u usage时,它非常接近50M。当我将内存限制设置得更高,设置为90M,memory\u get\u peak\u usage显示大约75M,脚本加载速度大约快10秒 不管内存限制如何,脚本都会使用大致相同的内存量,这似乎很直观,但事实似乎并非如此。如果一个脚本的最大值不到50米,限制为50米,那么即使内存限制增加了,我也希望它的峰值使用量是相同的

我有一个脚本,在大约25秒的运行时间内,当PHP的内存限制设置为
50M
时,它会成功运行。当我在脚本末尾打印
memory\u get\u peak\u usage
时,它非常接近
50M
。当我将内存限制设置得更高,设置为
90M
memory\u get\u peak\u usage
显示大约
75M
,脚本加载速度大约快10秒

不管内存限制如何,脚本都会使用大致相同的内存量,这似乎很直观,但事实似乎并非如此。如果一个脚本的最大值不到50米,限制为
50米
,那么即使内存限制增加了,我也希望它的峰值使用量是相同的


我唯一的解释是PHP认识到它接近极限,并花费时间清除未使用的内存以避免达到极限。这是它的实际工作方式还是我刚刚触及了更大的问题的表面?

我找不到确凿的证据,但我记得/相信内存限制设置了php将使用的每个脚本的内存量与使用的内存量(php用于管理自身的开销在数量上略有不同)

从手册开始

参数

实际使用

将此值设置为TRUE,以获取从系统分配的内存的实际大小。如果未设置或为FALSE,则仅报告emalloc()使用的内存


你看到的是垃圾收集器在做它的工作

重新定义非基本变量值时,旧值不会立即从内存中丢弃。它会保留在内存中,作为脚本内存使用的一部分

只有当您的脚本危险地接近其内存限制时,才会调用垃圾收集器清理未使用的已分配内存,以便为脚本释放更多空间。此过程非常缓慢,这就是为什么脚本会使用更多内存运行得更快的原因-垃圾收集器并不经常需要

编辑:


缓冲也参与了这一过程。如果脚本正在将大量数据写入文件,则此数据首先在内存中排队,因为您的硬盘无法以生成数据的速度写入此数据。如果生成数据的速度比磁盘写入数据的速度快得多,则最终可用内存将被填满,并且您的程序将运行下次尝试
fwrite()时将被迫等待
或使用任何将数据放入缓冲区的函数。

memory\u get\u peak\u usage
显示脚本分配的内存量。
memory\u limit
指令限制脚本可以使用的内存量。您完全正确。但是,无论
real\u usage
参数如何,
memory\g的值更改
内存限制值时,et\u peak\u usage
会增加,脚本的运行时间会减少。我想知道原因。memory\u limit指令限制脚本执行环境可以使用的内存量(包括环境用于管理自身的内存量)因此,您的脚本可以使用的内存量稍微少了一点,这并不是因为PHP释放内存以避免达到限制-而是因为PHP没有为环境提供内存,否则它会为环境提供内存,因为内存限制设置得很低,对不对?当可用内存较少时,PHP会限制其内存使用,例如文件缓存..有任何文档支持这一点吗?我的印象是PHP的垃圾收集器并不是它清除内存的主要方法。具体是什么时候启动的,我不知道。但是它确实存在,而且有一些事实你可以通过谷歌的一点研究找到。我发现这个现有的问题和答案非常有趣与您的问题相关的问题:。它触及了重新分配内存的主题,这也很可能是这里的问题。但是,这取决于具体的代码,您没有显示任何代码,因此,如果您遇到的问题是因为垃圾回收器更频繁地出现,那么您在这里会有点发问。