PHP大文件上传失败,修改php.ini配置未生效求助
问题概述
- 小文件上传正常,11M左右的测试文件上传静默失败
- 修改
/etc/php.ini的post_max_size=0、upload_max_filesize=128G后,重启Apache,配置未生效(phpinfo()显示无变化) - 上传失败时无错误输出,希望在浏览器页面显示错误信息
平台信息:
PHP Version 8.2.6 System Linux server1 6.2.9-300.fc38.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Mar 30 22:32:58 UTC 2023 x86_64 Build Date May 9 2023 06:25:31 Build System Fedora release 38 (Thirty Eight) Build Provider Fedora Project Compiler gcc (GCC) 13.1.1 20230426 (Red Hat 13.1.1-1) Architecture x86_64 Server API FPM/FastCGI Virtual Directory Support disabled Configuration File (php.ini) Path /etc Loaded Configuration File /etc/php.ini Scan this dir for additional .ini files /etc/php.d
解决步骤
一、修复php.ini配置不生效问题
你的Server API是FPM/FastCGI,重启Apache无法加载PHP配置,必须重启PHP-FPM服务:
- 执行命令:
sudo systemctl restart php-fpm(Fedora下服务名可能为php8.2-fpm,根据实际版本调整,比如sudo systemctl restart php82-fpm)
额外检查:
- 查看
phpinfo()中的Additional .ini files parsed部分,确认/etc/php.d目录下是否存在覆盖post_max_size、upload_max_filesize的配置文件,这类文件优先级高于主php.ini
二、补充上传相关配置
除已修改的两项,还需在php.ini中添加/调整以下配置:
max_execution_time = 300(上传大文件需要更长执行时间)max_input_time = 300memory_limit = 256M(确保内存足够处理大文件)
修改完成后,再次重启PHP-FPM服务。
三、开启错误输出并完善上传逻辑
1. 开启浏览器错误显示
在PHP代码开头添加:
ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL);
或者在php.ini中设置display_errors = On,重启PHP-FPM生效。
2. 完善上传错误检查
替换原代码中的循环逻辑,添加错误判断:
<?php ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (isset($_FILES['files'])) { $errors = []; $path = 'uploads/'; $extensions = ['jpg', 'jpeg', 'png', 'gif', 'txt', 'mpeg']; $all_files = count($_FILES['files']['tmp_name']); // 确保上传目录存在 if (!is_dir($path)) { mkdir($path, 0755, true); } for ($i = 0; $i < $all_files; $i++) { $file_name = $_FILES['files']['name'][$i]; $file_tmp = $_FILES['files']['tmp_name'][$i]; $file_size = $_FILES['files']['size'][$i]; $file_ext = strtolower(pathinfo($file_name, PATHINFO_EXTENSION)); $file = $path . $file_name; // 检查上传错误码 if ($_FILES['files']['error'][$i] !== UPLOAD_ERR_OK) { $errors[] = "文件 $file_name 上传错误,错误码:" . $_FILES['files']['error'][$i]; continue; } // 检查扩展名 if (!in_array($file_ext, $extensions)) { $errors[] = "文件 $file_name 扩展名不允许,支持格式:" . implode(', ', $extensions); continue; } // 检查文件大小(可选) if ($file_size > 11 * 1024 * 1024) { $errors[] = "文件 $file_name 大小超出限制(最大11M)"; continue; } // 移动文件并验证结果 if (!move_uploaded_file($file_tmp, $file)) { $errors[] = "文件 $file_name 移动失败,请检查目录权限"; } } if (!empty($errors)) { echo "<ul>"; foreach ($errors as $error) { echo "<li>$error</li>"; } echo "</ul>"; } else { echo "<p>所有文件上传成功!</p>"; } } }
四、检查Apache配置(可选)
如果上述步骤生效后仍有问题,检查Apache的LimitRequestBody设置:
- 在Apache虚拟主机配置或
httpd.conf中,确认是否设置了LimitRequestBody,若值过小(比如10485760即10M)会限制POST请求大小,需改为更大值或设为0(不限制) - 修改后重启Apache:
sudo systemctl restart httpd
内容的提问来源于stack exchange,提问作者Richard T
相关产品推荐
相关产品推荐

