我有一个脚本,当PHP的memory_limit在运行时间大约25秒时设置为50M
时成功运行。当我在脚本末尾打印memory_get_peak_usage
时,它与50M
非常接近。当我将memory_limit设置得更高时,90M
,memory_get_peak_usage
显示75M
左右,脚本加载速度提高约10秒。
看起来直观的是,无论memory_limit如何,脚本都会使用大约相同数量的内存,但似乎并非如此。如果脚本最大不超过50M且限制为50M
,我原本预计即使memory_limit已增加,峰值使用率也会相同。
我唯一的解释是PHP识别它接近极限并花费时间清除未使用的内存以避免达到限制。这是它实际上是如何工作的还是我只是划破了更大的表面?
答案 0 :(得分:2)
你看到的是垃圾收集器正在发挥作用。
重新定义非原始变量值时,旧值不会立即从内存中丢弃。它仍然存在,作为脚本内存使用的一部分。
只有当您的脚本危险地接近其内存限制时,才会调用垃圾收集器来清理那些未使用的已分配内存,以便为脚本释放更多空间。这个过程非常顺畅,这就是为什么脚本运行速度更快,内存更多 - 垃圾收集器不需要经常使用。
编辑:
缓冲也参与其中。如果您的脚本正在向文件写入大量数据,则此数据首先在内存中排队,因为您的硬盘将无法像生成此数据那样快速地写入此数据。如果生成数据的速度比磁盘写入速度快得多,最终可用内存将会填满,下次尝试fwrite()
或使用任何将数据放入缓冲区的函数时,程序将被强制等待。 / p>
答案 1 :(得分:1)
我找不到这方面的硬证明但是我记得/相信memory_limit设置php将使用每个脚本的内存量vs memory_get_peak_usage显示你的脚本分配的内存(php的开销量略有差异)用来管理自己)
上的手册参数
real_usage
将此值设置为TRUE以获取从系统分配的实际内存大小。如果未设置或FALSE,则仅报告emalloc()使用的内存。