PHP 执行时间与内存管理解析

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 代码编程 发布于11个月前 更新于11个月前 811

一、核心参数速查表

参数名 作用范围 默认值 优先级规则 修改方式
max_execution_time PHP 脚本 30秒 代码中set_time_limit()可覆盖 php.iniset_time_limit()
memory_limit PHP 脚本 128M 代码中ini_set()优先级更高 php.iniini_set()
request_terminate_timeout PHP-FPM 0(无限制) 必须 ≥ PHP脚本设置的时间 PHP-FPM 配置文件
proxy_read_timeout Nginx 60秒 必须 ≥ PHP-FPM的超时 Nginx 配置文件

优先级口诀
Nginx > PHP-FPM > PHP代码设置 > php.ini默认值


二、参数详解与示例

1. max_execution_timeset_time_limit()

  • 作用:控制脚本最大执行时间(秒)。
  • 关联性:若同时存在,代码中的set_time_limit()会覆盖php.ini中的设置。
  • 示例:允许脚本运行 5 分钟
    <?php
    // 方法1:代码中动态设置(推荐)
    set_time_limit(300); // 300秒=5分钟
    
    // 方法2:直接修改 php.ini
    // max_execution_time = 300
    

2. memory_limit 内存限制

  • 作用:限制脚本最大内存使用(如128M, 2G)。
  • 优先级:代码中的ini_set('memory_limit', '256M')会覆盖php.ini
  • 示例:处理大文件时提升内存
    <?php
    ini_set('memory_limit', '512M'); // 临时提升到512MB
    $data = file_get_contents('huge_file.csv'); // 加载大文件
    

3. request_terminate_timeout(PHP-FPM)

  • 作用:强制终止超时的 PHP 请求(覆盖 PHP 脚本设置)。
  • 配置位置:PHP-FPM 池配置文件(如/etc/php/8.2/fpm/pool.d/www.conf)。
  • 示例:允许 PHP-FPM 处理 10 分钟请求
    ; www.conf
    request_terminate_timeout = 600s ; 必须 ≥ PHP脚本设置的时间
    

4. proxy_read_timeout(Nginx)

  • 作用:Nginx 等待 PHP 返回结果的最大时间。
  • 配置位置:Nginx 站点配置文件(如/etc/nginx/sites-available/default)。
  • 示例:避免 Nginx 提前断开 PHP 长任务
    location ~ \.php$ {
        proxy_read_timeout 600s;  # 600秒=10分钟
        fastcgi_read_timeout 600s;
    }
    

三、参数关联与配置原则

1. 时间参数层级关系

用户浏览器 → Nginx超时 → PHP-FPM超时 → PHP脚本时间
  • 规则:每层时间必须 ≥ 下一层,否则外层会提前终止请求。
  • 错误案例
    PHP脚本设置set_time_limit(300)(5分钟),但 PHP-FPM 配置request_terminate_timeout=200s,实际脚本最多运行 200秒

2. 内存参数规则

  • 代码优先ini_set('memory_limit', '256M') 优先级高于 php.inimemory_limit
  • 无限制风险:设置为-1(无限制)时,需绝对信任代码,否则易导致服务器崩溃。

四、常见问题解答

1. 如何让脚本无限制执行?(慎用!)

<?php
// 代码中解除限制
set_time_limit(0);         // 时间无限制
ini_set('memory_limit', '-1'); // 内存无限制

// 必须同步修改外部配置
// PHP-FPM: request_terminate_timeout=0
// Nginx: proxy_read_timeout=0

安全提示:生产环境建议设置合理阈值,仅在测试环境使用无限制。

2. 为什么修改了 set_time_limit() 仍报超时?

  • 原因:外层 PHP-FPM 或 Nginx 配置了更短的时间。
  • 解决
    1. 检查 PHP-FPM 的 request_terminate_timeout
    2. 检查 Nginx 的 proxy_read_timeout
    3. 确保外层时间 ≥ PHP 脚本设置的时间。

3. 内存溢出(Allowed memory size)如何快速定位?

  • 步骤
    1. 在代码中插入内存检查点:

      echo "当前内存: " . memory_get_usage()/1024/1024 . "MB\n";
      
    2. 排查循环或递归中是否累计数据未释放。

    3. 使用生成器替代大数组:

      function readLargeFile() {
          $file = fopen('huge.csv', 'r');
          while (!feof($file)) {
              yield fgets($file); // 逐行读取,内存占用极低
          }
      }
      

4. CLI 模式与 Web 模式的差异

  • 执行时间:CLI 模式默认无限制(max_execution_time=0)。

  • 内存限制:CLI 可通过命令行参数动态设置:

    php -d memory_limit=2G script.php
    

5. 如何永久修改配置?

  • 全局生效:修改 php.ini(路径可通过 php --ini 查找)。

  • 立即生效:重启 PHP-FPM 和 Nginx:

    sudo systemctl restart php-fpm.service nginx.service
    
THE END

喜欢就支持一下吧!

版权声明:除却声明转载或特殊注明,否则均为艾林博客原创文章,分享是一种美德,转载请保留原链接,感谢您的支持和理解

才有长短,取其长则不问其短;情有忠伪,信其忠则不疑其伪。

王安石

推荐阅读

PHP Trait 的优势及使用场景详解

本文详细讲解了 PHP Trait 的定义、优势、使用场景及最佳实践,帮助开发者深入理解这一强大的代码复用工具,并在实际...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 01月10日

Laravel ORM(Eloquent)深入探究:强大的查询构造器

本文深入探讨了Laravel的Eloquent ORM中强大的查询构造器功能,特别是where方法及其多种变体和使用方式...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 03月19日

一文读懂 XSS 攻击:原理、类型与防范措施

本文详细介绍了 XSS 攻击的原理、三种类型(反射型、存储型、DOM - Based),并通过示例进行说明,同时给出了输...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 03月05日

查看内存系列命令应用以及介绍【Linux 篇】

在日常运维Linux系统时,物理内存是其中最重要的一方面。Linux 本身提供了少的方法来帮助我们查看相关信息!下面是一...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 12月08日

[Mysql] 常用语句汇总

mysql学习教程,集合mysql的入门常见语句语法,包括数据以及服务的操作等

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 03月08日

Linux 用户与权限全攻略:从 chmod 到 chown,带你搞懂权限设计的底层逻辑

深入讲解 Linux 用户与权限管理,包含 chmod、chown 的使用方式,如何查看和管理系统用户与用户组,并从开发...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 05月16日

PHP数组创建方法大全

本文详细介绍了PHP中创建数组的各种方法,包括基本数组创建、索引数组、关联数组、多维数组以及使用特定函数如range()...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 05月23日