PHP上线前必须修改php.ini默认配置:upload_max_filesize与post_max_size需配对调大,max_execution_time和max_input_time须协同Web服务器超时,memory_limit要与OPcache及FPM进程数匹配,disable_functions和expose_php是安全底线,改后须重启PHP服务。

PHP独立环境装完不能直接上线,php.ini里一堆默认值是为开发机设的,不是为生产服务器设的。不改,轻则上传失败、脚本超时、内存爆掉,重则被扫描器利用危险函数打穿。
upload_max_filesize 和 post_max_size 必须配对调大
这两个参数是上传大文件的第一道关卡,单改一个没用,必须同时调且满足 post_max_size ≥ upload_max_filesize。
-
upload_max_filesize = 100M:只管单个文件大小,比如用户传一张100MB的PDF -
post_max_size = 101M:管整个POST请求体,包括文件+表单字段+边界分隔符,所以必须比 upload 值略大 - 如果只改了
upload_max_filesize而没动post_max_size,Nginx 或 Apache 日志里会静默丢弃请求,浏览器端只看到 500 或空白页,查不到明确错误 - Discuz、PHPCMS 这类老系统对 POST 大小更敏感,有些版本还会在后台二次校验,得同步检查其自身配置项
max_execution_time 和 max_input_time 不是“越长越好”
它们控制的是 PHP 层面的超时,但和 Web 服务器(Nginx/Apache)的超时是两套机制,必须协同,否则会出现“PHP 没超时,但 Nginx 先断了连接”的 504 错误。
-
max_execution_time = 120:脚本总执行时间,不含 IO 等待。适合处理耗时逻辑,比如生成报表、批量导入 -
max_input_time = 60:只管接收 POST/GET 数据的时间,上传大文件时这个值必须足够——它从请求头到达开始计时,不是从文件流开始算 - 若你设了
max_input_time = 300,但 Nginx 的client_body_timeout是 10s,那 PHP 根本等不到数据收完就被 Nginx 切断了 - ThinkPHP、Laravel 等框架的上传中间件可能额外加了 timeout 钩子,得看框架文档确认是否覆盖了 PHP 原生设置
memory_limit 和 OPcache 缓存要一起看
内存不是设得越高越安全,而是要和 OPcache 的 JIT 缓冲区、FPM 进程数一起算账。盲目调高 memory_limit 可能导致 FPM 进程数锐减,反而降低并发能力。
立即学习“PHP免费学习笔记(深入)”;
-
memory_limit = 256M是中小型应用较稳妥的起点;超过 512M 要谨慎,尤其在 2G 内存的 VPS 上 -
opcache.enable=1和opcache.memory_consumption=128必须启用,否则每次请求都重新解析 PHP 文件,CPU 白烧 - PHP 8.5 开启 JIT 后,
opcache.jit_buffer_size至少设为 64M,否则 JIT 编译频繁触发缓冲区满,反而拖慢响应 - 用
php -i | grep "memory_limit\|opcache"快速验证是否生效,别只信配置文件改了
disable_functions 和 expose_php 是安全底线
这两个不是性能参数,但一旦漏配,轻则信息泄露,重则命令执行。很多线上事故就源于部署时跳过了这一步。
-
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source:禁用常见危险函数,尤其注意curl_exec和parse_ini_file容易被忽略 -
expose_php = Off:关掉后 HTTP 响应头里就不会出现X-Powered-By: PHP/8.2.12,减少攻击面 - 外贸网站、PHPCMS、Discuz 这类开源程序常自带调试接口或安装向导,上线前务必删掉 install/、install.php、debug.php 等路径,光禁函数不够
- 修改完
php.ini后,记得重启 PHP-FPM(sudo systemctl restart php-fpm)或 Apache(sudo systemctl restart httpd),Nginx 不管 PHP 配置 reload
真正容易被忽略的,是 max_input_time 和 Web 服务器超时的配合,以及 disable_functions 里 curl_exec 这种看似无害实则高危的函数。很多人测上传功能只盯着 upload_max_filesize,却没意识到 Nginx 已经在 30 秒就把连接掐了。



















