Nic*_*ing 5 php memory memory-management
当PHP的memory_limit设置为50M运行时间约25秒时,我有一个成功运行的脚本.当我memory_get_peak_usage在脚本的末尾打印时,它非常接近50M.当我将memory_limit设置得更高时,to 90M,memory_get_peak_usagearound around 75M并且脚本加载速度提高了大约10秒.
看起来直观的是,无论memory_limit如何,脚本都会使用大约相同数量的内存,但似乎并非如此.如果一个脚本最大限度在50M以下,并且有一个限制50M,我原本预计即使memory_limit增加了峰值使用率也是一样的.
我唯一的解释是PHP认识到它接近极限并花费时间清除未使用的内存以避免达到限制.这是它实际工作的方式还是我只是划破了更大的表面?
您所看到的是垃圾收集器正在执行其工作。
当您重新定义非原始变量值时,旧值不会立即从内存中丢弃。它保留在那里,作为脚本内存使用的一部分。
仅当您的脚本危险地接近其内存限制时,才会调用垃圾收集器来清理那些未使用的已分配内存,以便为脚本释放更多空间。这个过程是缓慢的,这就是为什么脚本会在更多内存下运行得更快 - 垃圾收集器并不需要那么频繁。
编辑:
缓冲也参与其中。如果您的脚本将大量数据写入文件,这些数据首先会在内存中排队,因为您的硬盘将无法像生成数据一样快地写入这些数据。如果您生成数据的速度比磁盘写入数据的速度快得多,则最终可用内存将被填满,并且您的程序将在您下次尝试fwrite()或使用任何将数据放入缓冲区的函数时被迫等待。