当
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认识到它接近极限并花费时间清除未使用的内存以避免达到限制.这是它实际工作的方式还是我只是划破了更大的表面?
你看到的是垃圾收集器正在完成它的工作.
重新定义非原始变量值时,旧值不会立即从内存中丢弃.它仍然存在,作为脚本内存使用的一部分.
只有当您的脚本危险地接近其内存限制时,才会调用垃圾收集器来清理那些未使用的已分配内存片段,以便为脚本释放更多空间.这个过程非常顺畅,这也就是为什么脚本运行速度更快,内存更多 – 垃圾收集器不需要经常使用.
编辑:
缓冲也参与其中.如果您的脚本正在向文件写入大量数据,则此数据首先在内存中排队,因为您的硬盘将无法像生成此数据那样快速地写入此数据.如果生成数据的速度比磁盘写入速度快得多,最终可用内存将会填满,下次尝试fwrite()或使用任何将数据放入缓冲区的函数时,程序将被强制等待.