php-fpm可以通过配置worker进程的数量等信息避免内存泄露。
那我们该当如何去作出最优的配置呢。

观点

内存溢出

内存溢出便是用户进程向操作系统申请了一块内存,但是写入的内容却大于内存的大小。
便是我们常见的OOM(out of memory)。

内存泄漏phpphpfpm是若何避免内存泄露的 Java

内存泄露

内存泄露便是用户进程向操作系统申请了一块内存,利用完成之后并不会开释该内存,造成该内存无法被操作系统回收再次被利用。
便是我们常见的 Memory Leak。
如果内存泄露长期堆积一定会耗尽内存,造成内存溢出。

php中内存溢出的场景

整型越界

测试代码

<?php$i = 9223372036854775807;$j = $i + 1;var_dump($i,$j);

运行结果

php整型内存溢出

可以看到整型内存泄露,php并不会报错,只是将int类型转化为了float类型。

php-fpm内存泄露

测试代码

<?phpini_set("memory_limit", "4M");var_dump(ini_get("memory_limit"));$arr = [];while (true) { $arr[] = "hello world";}

运行结果

php-fpm设置的最大内存被耗尽

可以看到php-fpm许可的内存已经被花费殆尽 ,此时该php-fpm进程会被kill。

掌握php-fpm OOM的方法

php.ini配置文件内的 memory_limit 配置可以限定单个 php-fpm内利用内存的大小。

常日来说只要程序员开拓中把稳内存的花费,再加上 php-fpm 本身的 kill & fork 机制,很少会涌现内存溢出。

php-fpm的配置文件可以掌握 php-fpm 进程的数量。

php-fpm不仅仅只是掌握 worker 进程数量,还有 worker 进程的 kill & fork。
如果一个 worker 进程一贯在运行,一定会涌现泄露,进而导致内存溢出。
以是php-fpm进程通过一定的策略,kill worker进程,开释内存,内存重新被操作系统回收,然后 fork worker进程,操作系统重新分配内存给新的 worker 进程,这样就有效地防止了内存的溢出。

通过对 memory_limit 、php-fpm进程数量的掌握,就可以掌握 php-fpm 利用全体主机的内存大小。

php-fpm参数先容

php-fpm配置文件max_children掌握 worker 进程的最大数量。

php-fpm配置文件max_requests 最大处理多少要求就 kill & fork php-fpm。

php-fpm配置max_spare_children掌握最大空闲php-fpm数量。

php-fpm配置min_spare_children掌握最小空闲 php-fpm 数量。

php-fpm配置start_servers 启动是 php-fpm 进程数量。

php-fpm配置process_idel_timeout 空闲进程超时时间。