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

一、先确认 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 会在解析请求体前直接拒绝,POST和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_limit、post_max_size等关键字,确认数值已变更。检查完毕务必删除该文件。
第三步:测试上传与表单提交
构造一个超过原限制的测试文件或表单,确认业务功能正常,同时观察 /var/log/php_errors.log是否有异常记录。
⚠️ 本文配置推荐值基于通用生产,实际部署时需结合服务器内存、业务负载、框架要求综合评估,建议先在预发环境验证再上线。

