memory_limit 顾名思义,即限制 PHP 进程对于内存的使用。例如:

magento2 的系统要求里有关于 PHP memory_limit 的限制,不能低于 512M。(默认值为 128M, 如果不更改,会导致 magento 的后台处理逻辑无法正常执行)

看一下 PHP 官网的解释

This sets the maximum amount of memory in bytes that a script is allowed to allocate. This helps prevent poorly written scripts for eating up all available memory on a server. Note that to have no memory limit, set this directive to -1.

需要注意的是,memory_limit 的值越高,即单个 PHP 进程占用的内存越多,系统能够并发处理的请求越少。例如,一个 2G 内存的机器

  • memory_limit 设为 128M, 则同时最多能处理 16 个请求

  • memory_limit 设为 256M, 则同时最多能处理 8 个请求

  • memory_limit 设为 512M, 则同时最多能处理 4 个请求

memory_limit 的值是越大越好么?

当然不是,memory_limit 主要是为了防止程序 bug, 或者死循环占用大量的内存,导致系统宕机。在引入大量三方插件,或者代码时,进行内存限制就非常有必要了。

memory_limit 会使每个 PHP process 都占用固定的内存?

还是仅仅为分配内存的上限?测试一下

思路,memory_limit 设置为 10M, PHP 请求中初始化一个 2M/20M 的字符串,看看系统进程中内存的占用情况。

Nginx 配置

server {listen 8093;root /home/zhongwei/work/test/memory_limit/;index index.php index.html index.htm;server_name localhost;location / {# try_files $uri $uri/ =404;try_files $uri $uri/ /index.php?q=$uri&$args;}location ~ \.php$ {include snippets/fastcgi-php.conf;fastcgi_param PHP_VALUE "memory_limit = 10M";fastcgi_pass unix:/run/php/php7.0-fpm.sock;}
}

PHP 测试文件

<?php$char_count = 2;
$M = 1024 * 1024;echo sprintf("Current memory_limit value is: %s.", ini_get('memory_limit'));
echo sprintf('<br/>Amount of memory allocated to PHP: %0.3fM.', memory_get_usage() / $M);
$s = str_repeat("a", $M * $char_count);
//sleep(30);
echo sprintf('<br/>Amount of memory allocated to PHP: %0.3fM.', memory_get_usage() / $M);
echo sprintf('<br/>Total memory allocated from system: %0.3fM.', memory_get_usage($real_usage=true) / $M);
echo '<br/>success';

测试结果

$char_count 为 2 时,即初始化一个占用内存 2M 的字符串,输出结果为

Current memory_limit value is: 10M.
Amount of memory allocated to PHP: 0.344M.
Amount of memory allocated to PHP: 2.348M.
Total memory allocated from system: 4.004M.
success

$char_count 为 20 时,即初始化一个占用内存 20M 的字符串,输出结果为

Current memory_limit value is: 10M.
Amount of memory allocated to PHP: 0.346M.

注意,HTTP 状态码为 500, 也就是说执行到字符串初始化的时候,PHP 进程被系统干掉了。

看一下 Nginx error.log 中记录的日志信息

2017/03/01 10:41:23 [error] 6903#6903: *39 FastCGI sent in stderr: "PHP message: PHP Fatal error:  Allowed memory size of 10485760 bytes exhausted (tried to allocate 20971552 bytes) in /home/zhongwei/work/test/memory_limit/index.php on line 8
PHP message: PHP Stack trace:
PHP message: PHP   1. {main}() /home/zhongwei/work/test/memory_limit/index.php:0
PHP message: PHP   2. str_repeat() /home/zhongwei/work/test/memory_limit/index.php:8" while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.0-fpm.sock:", host: "localhost:8093"

实际测试结果说明,memory_limit 只是限制了每个 PHP 进程的内存占用上限,而不是为每个进程分配了固定的内存。所以,并不会因为 memory_limit 设置越大,导致并发数出现降低。

memory_limit 的默认值为多少

  • PHP 5.2 之前为 8M

  • PHP 5.2 为 16M

  • PHP 5.2 之后的版本为 128M

使用 memory_limit 限制 PHP 进程的内存使用相关推荐

  1. 查看php-fpm进程数_查看php-fpm开启的进程数以及每个进程的内存限制

    查看php-fpm开启的进程数以及每个进程的内存限制 1.通过命令查看服务器上一共开了多少的 php-cgi 进程 ps -fe |grep "php-fpm"|grep &quo ...

  2. Java进程占用内存超高分析

    Java进程占用内存超高分析_ 1. 报错 2. 解决 3. 我用到的解决方法 写了一个Java服务,没有定时服务,没有线程池,没有重度的读写,只是对外提供了几个接口,接口的访问量并不高,结果占用内存 ...

  3. 线程的挂起是错误的概念实际是线程的阻塞,挂起只针对进程,将进程挂起会将进程从内存空间交换到磁盘空间的过程

    线程的挂起是错误的概念实际是线程的阻塞 线程的主要状态有运行态,就绪态和阻塞态.挂起态对线程没有什么意义,这是由于此类状态是一个进程级的概念.特别地,如果一个进程被换出,由于它的所有线程都该进程的地址 ...

  4. Java进程占用内存过高,排查解决方法

    Java进程占用内存过高,排查解决方法 参考文章: (1)Java进程占用内存过高,排查解决方法 (2)https://www.cnblogs.com/eeexu123/p/10913389.html ...

  5. AIX 查看进程的内存使用情况

    2019独角兽企业重金招聘Python工程师标准>>> svmon -P 命令显示系统上当前正在运行的所有进程的内存使用情况统计信息. 下面是 svmon -P 命令的示例: # s ...

  6. 内存分配的原理__进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)

    如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看. majflt代表major fault,中文名叫大错误,minflt代表minor faul ...

  7. oracle limsize,Oracle9i AIX上单进程占用内存过多问题

    Oracle9i AIX上单进程占用内存过多问题 作者:Piner 这个问题最早应当是gototop发现的,那已经是很多年以前的事情了,不过,一直到现在,这个问题其实没有最终解决,所以,这个补丁还是不 ...

  8. 【Linux 内核 内存管理】内存管理架构 ⑤ ( sbrk 内存分配系统调用代码示例 | 在 /proc/pid/maps 中查看进程堆内存详情 )

    文章目录 一.sbrk 内存分配系统调用代码示例 二.在 /proc/pid/maps 中查看进程堆内存详情 本篇博客调用 sbrk 系统调用函数 , 申请并修改 堆内存 , 并在 /proc/pid ...

  9. 【Android 逆向】修改运行中的 Android 进程的内存数据 ( 使用 IDA 分析要修改的内存特征 | 根据内存特征搜索修改点 | 修改进程内存 )

    文章目录 一.使用 IDA 分析要修改的内存特征 二.根据内存特征搜索修改点 三.修改进程内存 一.使用 IDA 分析要修改的内存特征 在前的博客 [Android 逆向]逆向修改游戏应用 ( 分析应 ...

最新文章

  1. druiddatasource配置_Springboot属性注入 Java配置和Value配置
  2. mysql merge表介绍
  3. Linux 下 VuePress 的安装使用
  4. xcode5.0打包IPA
  5. 用map实现数据字典功能
  6. 传统公司部署OpenStack(t版)简易介绍(二)——Keystone组件部署
  7. Windows Server 笔记之备份与灾难恢复
  8. 22.1-在散列集上进行集合操作
  9. 编译 java_如何编译java
  10. 什么是SDN,为什么要有SDN,SDN有什么安全问题
  11. Unity常用图片格式说明
  12. 请求的url中带#是什么意思呢?
  13. 【嵌入式开发】监测系统——用QT编写下位机
  14. Windows桌面端录屏采集实现
  15. 关闭惠普计算机通电启动注册表,惠普电脑自动重启的解决方法
  16. 树莓派 安装Transmission并自动挂载移动硬盘
  17. PXC 配置笔记-从MySQL直接转成PXC集群
  18. SpringCloud之Eureka(微服务注册)
  19. IOS上架APP网络ipv4转ipv6
  20. 万网虚拟空间二级域名绑定子目录

热门文章

  1. ASP内置对象及其作用
  2. 【程序】STM32H743ZI单片机驱动DP83848以太网PHY芯片,移植lwip 2.1.3协议栈,并加入网线热插拔检测的功能
  3. 华为服务器怎么进入系统,服务器怎么进入系统
  4. 如何使用 DOI 快速找到论文的全文下载网址
  5. 单刷 3 届 Hackathon,朝着理想中的数据库出发丨TiDB Hackathon 选手访谈
  6. FME在测量平差上面的运用
  7. Visual Studio 2019 打包生成.exe安装文件,附带.net框架与自定义安装插件
  8. 华师c语言作业,C语言程序设计(华师在线作业)1.doc
  9. 堆排序(大根堆与小根堆)
  10. mysql成绩表_mysql--学生课程成绩表