5

当 PHP 的 memory_limit 设置为50M大约 25 秒的运行时间时,我有一个脚本可以成功运行。当我在脚本末尾打印memory_get_peak_usage时,它非常接近50M. 当我将 memory_limit 设置得更高时,to 会90M显示memory_get_peak_usage75M脚本加载速度会快 10 秒。

无论memory_limit如何,脚本都会使用大约相同数量的内存,这似乎很直观,但似乎并非如此。如果脚本在 50M 的限制下达到最大值50M,我预计即使 memory_limit 已增加,峰值使用量也会相同。

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

4

2 回答 2

2

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

当您重新定义非原始变量值时,旧值不会立即从内存中丢弃。它仍然存在,作为脚本内存使用的一部分。

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

编辑:

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

于 2013-03-31T04:55:01.483 回答
1

我找不到确切的证据,但我记得/相信 memory_limit 设置了 php 将使用每个脚本的内存量,而 memory_get_peak_usage 显示了你的脚本分配的内存(php 用来管理的开销的数量略有不同本身)

来自memory_get_peak_usage的手册

参数

real_usage

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

于 2013-03-31T04:31:24.790 回答