PHP 部署到 Linux 必改的 5 个 php.ini 配置

发布于
1

PHP 部署到 Linux 生产环境时,默认的 php.ini 参数往往偏向开发便利或保守安全,并不能直接适配真实业务负载。本文基于 PHP 官方手册与主流运维实践,梳理出部署时必须调整的 5 个核心配置,并附上参数对照表、生效验证方式与常见问题解答。

PHP部署核心配置对比图表

一、先确认 php.ini 的真实路径

修改前必须先确认 PHP 实际加载的是哪一个配置文件,不同运行模式(CLI、FPM、Apache 模块)可能对应不同文件。

# 命令行查看 CLI 模式加载路径
php --ini

# 查看输出中的 Loaded Configuration File 行
Loaded Configuration File: /etc/php/8.1/fpm/php.ini

常见路径参考:

运行模式

典型路径

CLI

/etc/php/{版本}/cli/php.ini

PHP-FPM

/etc/php/{版本}/fpm/php.ini

Apache 模块

/etc/php/{版本}/apache2/php.ini

修改完成后,FPM 环境执行 sudo systemctl restart php8.1-fpm,Apache 环境执行 sudo systemctl restart apache2,Nginx + FPM 组合还需 sudo systemctl reload nginx

二、5 个必改配置

1. memory_limit:脚本内存上限

该指令设定单个 PHP 脚本可分配的最大内存字节数,默认值 128M,作用范围是 INI_ALL。

当应用涉及图片处理、大数组运算、Excel 导出等场景时,128M 很容易触顶,导致脚本被中断。

推荐配置:

memory_limit = 256M

设置原则:并非越大越好。过大的内存限制在遭遇内存泄漏或异常请求时,会迅速耗尽服务器物理内存,触发 OOM Killer。企业站建议 256M,重型应用可上调至 512M,并通过监控数据持续观察调整。

2. max_execution_time:脚本最大执行时间

该指令定义脚本允许运行的最大秒数,默认 30 秒,作用范围 INI_ALL。

大数据报表导出、批量处理、第三方接口同步等耗时任务,在 30 秒限制下极易超时被强制终止。

推荐配置:

max_execution_time = 120

设置原则:根据业务耗时任务的实际运行时长设定,但不宜无限制放大。建议配合异步队列处理超长任务,而非单纯依赖延长执行时间。

3. post_max_size 与 upload_max_filesize:POST 与上传联动

这两个指令共同决定表单提交和文件上传的上限,是部署中最容易踩坑的一组配置。

  • upload_max_filesize:单个上传文件的最大尺寸,作用范围 INI_SYSTEM

  • post_max_size:整个 POST 请求体的最大尺寸,必须 >= upload_max_files_size

黄金法则:post_max_size 的值必须大于 upload_max_filesize。原因是 POST 请求体不仅包含文件数据,还包含表单字段、请求头开销等。

推荐配置:

upload_max_filesize = 64M
post_max_size = 80M

常见错误现象:即便只上传一个 50M 的文件,如果 post_max_size 仍为默认的 8M,PHP 会在解析请求体前直接拒绝,P​OST和FILES 都会变为空数组,且 $SERVER[‘REQUEST_METHOD’] 会被降级为 GET,这是诊断该类问题的明确信号。

4. max_input_vars:输入变量数量上限

该指令限制单次请求中通过 POST、GET、COOKIE 提交的输入变量总数,默认 1000,作用范围 INI_PERDIR。

当表单字段超过 1000 个(如 WordPress 自定义器、ACF 字段组、Laravel 复杂表单、批量数据提交)时,超出部分的变量会被静默丢弃,导致数据保存不完整。

推荐配置:

max_input_vars = 3000

设置原则:根据实际表单规模调整,一般 3000~5000 可覆盖大多场景。不建议盲目调得过高,过高的值在遇到异常请求时会消耗过多服务器资源。

5. expose_php 与 display_errors:信息泄露防护

这两项属于生产环境安全基线,直接关系到攻击者能否获取服务器指纹和内部路径。

expose_php​ 默认值为 On,开启时 HTTP 响应头会携带 X-Powered-By: PHP/8.x.x信息,直接暴露 PHP 版本,便于攻击者针对特定版本漏洞发起攻击。

display_errors​ 默认值为 On,开启时错误信息(含文件路径、SQL 片段、堆栈)会直接输出到页面,造成严重信息泄露。

推荐配置:

expose_php = Off
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log

配套建议:错误日志目录需确保 Web 服务器用户(如 www-data、nginx)具备写入权限,同时建议定期归档清理。

三、5 项配置速查表

下表汇总了本文涉及的 5 组核心配置及推荐值,可直接复制使用(路径以 PHP 8.1 FPM 为例):

配置项

默认值

推荐值

作用范围

修改后需重启

memory_limit

128M

256M

INI_ALL

FPM / Web 服务

max_execution_time

30

120

INI_ALL

FPM / Web 服务

upload_max_filesize

2M

64M

INI_SYSTEM

FPM / Web 服务

post_max_size

8M

80M

INI_PERDIR

FPM / Web 服务

max_input_vars

1000

3000

INI_PERDIR

FPM / Web 服务

expose_php

On

Off

php.ini only

FPM / Web 服务

display_errors

On

Off

INI_ALL

FPM / Web 服务

注:表中数据综合自 PHP 官方手册默认值与主流生产环境运维实践。

四、生效验证三步

修改配置后,按以下步骤确认生效,避免”改了但没生效”的常见误区:

第一步:确认配置文件路径

php --ini

输出中的 Loaded Configuration File即为实际生效文件,确保修改的是这一个。

第二步:在 Web 环境下用 phpinfo() 核对

创建一个临时 info.php

<?php phpinfo(); ?>

浏览器访问后搜索 memory_limitpost_max_size等关键字,确认数值已变更。检查完毕务必删除该文件。

第三步:测试上传与表单提交

构造一个超过原限制的测试文件或表单,确认业务功能正常,同时观察 /var/log/php_errors.log是否有异常记录。

⚠️ 本文配置推荐值基于通用生产,实际部署时需结合服务器内存、业务负载、框架要求综合评估,建议先在预发环境验证再上线。

常见问题(FAQ)

为什么只改了 upload_max_filesize,大文件还是上传失败?
因为 upload_max_filesize 受 post_max_size 约束。当整个 POST 请求体(文件 + 表单字段 + 协议开销)超过 post_max_size 时,请求在解析阶段就被拒绝。必须将 post_max_size 设置为大于等于 upload_max_filesize 的值。
php.ini 改完重启了,phpinfo() 显示还是旧值怎么办?
常见原因有三:① 修改的不是当前 SAPI 加载的那个 php.ini(CLI 和 FPM 是分开的);② Web 服务器(如 Apache)未重启,仅重启了 PHP-FPM;③ 配置被 .htaccess 或应用代码中的 ini_set() 覆盖了优先级。用 php --ini 和 phpinfo() 中的 Loaded Configuration File 双重确认路径。
memory_limit 设成 -1 是不是最省心?
不推荐。-1 表示不限制内存,一旦脚本存在内存泄漏或被恶意构造的请求触发,单个进程就可能吃满整机内存,引发连锁崩溃。生产环境应设置明确上限,并结合监控告警。
max_input_vars 调到 10000 会有性能问题吗?
设置过高的 max_input_vars 在遇到异常请求时会消耗过多的服务器资源,导致服务器性能下降。建议根据实际表单规模合理设置,一般 3000~5000 可覆盖大多场景。
display_errors 关了但页面还是能看到错误信息?
可能的原因:① 框架或应用在入口文件用 ini_set() 或 error_reporting() 强制打开了显示;② Nginx 将 PHP 的 stderr 直接作为 500 错误页返回,需在 Nginx 配置中启用 fastcgi_intercept_errors 并配置 error_page 兜底;③ 检查 .htaccess 是否有 php_flag display_errors on 覆盖。
0 讨论
热门最新
总结
暂无总结
0 / 600
嗨,下午好!
所有的成功,都源自一个勇敢的开始
¥10.00
10元抵扣券
已过期