PHP 上传大小限制如何修改|网站无法上传附件(参数调整实操教程)

发布时间:2026-07-23 16:37

当我们使用 PHP 构建的网站(例如 WordPress、Discuz、自建 CMS)上传文件时,经常遇到“文件过大”、“上传失败”或“附件无法上传”的提示。这通常不是服务器硬件问题,而是 PHP 默认的配置文件限制了上传大小。PHP 出于安全考虑,默认只允许上传 2MB 的文件。本教程将手把手教你如何修改这些参数,彻底解决文件上传大小限制问题。

## 前言介绍

网站无法上传附件,尤其是图片、PDF、视频等超过几兆的文件时,最常见的根源在于 PHP 的三个核心配置参数:`upload_max_filesize`、`post_max_size` 和 `max_execution_time`。这三个参数分别控制着“单个文件大小上限”、“整个 POST 请求数据量上限”以及“脚本执行超时时间”。很多用户只修改了第一个参数,却忽略了后两个,导致问题依旧存在。本教程将针对 Linux 服务器(Apache/Nginx)、Windows 服务器(IIS/Apache)以及虚拟主机(无服务器权限)三种常见环境,提供完整的修改方案。无论你是站长还是开发者,按照以下步骤操作,都能在 10 分钟内解决问题。

## 前置准备

在开始操作前,请确保你具备以下条件:

1. **服务器访问权限**:你需要能够登录到服务器(SSH 或远程桌面),或者至少能够访问网站根目录下的文件管理(例如 cPanel、宝塔面板)。

2. **文本编辑器**:准备一个纯文本编辑器,例如 Notepad++、VS Code、Sublime Text 或服务器自带的 vi/vim/nano。不要使用 Windows 自带的记事本,因为它可能破坏文件格式。

3. **获取 PHP 配置文件路径**:你需要知道当前 PHP 使用的是哪个 `php.ini` 文件。可以通过以下方法快速定位:

- 在网站根目录下创建一个 `info.php` 文件,内容为 ``。

- 在浏览器中访问 `http://你的域名/info.php`。

- 在打开的页面中搜索“Loaded Configuration File”,其右侧显示的路径就是当前 PHP 正在使用的 `php.ini` 文件路径(例如 `/etc/php/8.1/apache2/php.ini`)。

- 操作完成后,务必删除 `info.php` 文件,以免泄露服务器敏感信息。

4. **备份文件**:在修改任何配置文件之前,建议先备份原 `php.ini` 文件。例如执行 `cp /etc/php/8.1/apache2/php.ini /etc/php/8.1/apache2/php.ini.bak`。

## 分步操作步骤

### 步骤 1:定位并编辑 php.ini 文件

根据你的服务器环境,选择对应的方式打开 `php.ini` 文件。

**场景 A:Linux 服务器(使用 SSH 终端)**

1. 使用 SSH 工具(如 PuTTY、Terminal)登录服务器。

2. 根据前置准备中获取的路径,执行编辑命令。例如,使用 nano 编辑器:

```bash

sudo nano /etc/php/8.1/apache2/php.ini

```

如果你使用的是 Nginx + PHP-FPM,路径可能是 `/etc/php/8.1/fpm/php.ini`。请根据 `phpinfo()` 显示的实际路径修改。

3. 如果系统提示“command not found”,则先安装 nano:`sudo apt install nano` 或 `sudo yum install nano`。

**场景 B:Windows 服务器(使用远程桌面)**

1. 通过远程桌面连接 Windows 服务器。

2. 打开文件资源管理器,导航到 PHP 安装目录。通常位于 `C:\Program Files\PHP` 或 `C:\PHP` 下。

3. 找到 `php.ini` 文件。如果找不到,请在 `C:\Windows` 目录下搜索 `php.ini`。

4. 右键点击 `php.ini`,选择“打开方式”,然后选择“记事本”或其他编辑器。**强烈建议使用 Notepad++**,因为它能正确识别 Unix 换行符。

**场景 C:虚拟主机 / 共享主机(使用 cPanel 或宝塔面板)**

1. 登录你的主机控制面板(cPanel、Plesk、宝塔等)。

2. 寻找“PHP 设置”、“PHP 配置”或“软件管理”选项。

3. 在宝塔面板中,点击左侧“软件商店”,找到已安装的 PHP 版本,点击“设置”,然后选择“配置文件”。

4. 在 cPanel 中,找到“选择 PHP 版本”或“MultiPHP INI Editor”,通常可以直接在图形界面中修改参数,无需手动编辑文件。如果只能手动编辑,界面会提供 `php.ini` 的文本编辑框。

### 步骤 2:修改核心参数(upload_max_filesize 和 post_max_size)

在打开的 `php.ini` 文件中,使用搜索功能(Ctrl+W 在 nano 中,Ctrl+F 在记事本中)查找以下三个关键参数。找到后,修改等号后面的数值。

1. **修改 `upload_max_filesize`**:这是单个文件允许上传的最大值。

- 原始内容:`upload_max_filesize = 2M`

- 修改为:`upload_max_filesize = 64M` (根据你的需求,可以改为 128M、256M 或更大,例如 `1024M` 表示 1GB)

2. **修改 `post_max_size`**:这是整个 HTTP POST 请求的最大数据量。**这个值必须大于 `upload_max_filesize`**,因为上传的文件是 POST 数据的一部分。建议设置为 `upload_max_filesize` 的 1.5 到 2 倍。

- 原始内容:`post_max_size = 8M`

- 修改为:`post_max_size = 128M` (如果 `upload_max_filesize` 是 64M,这里建议至少 80M 或 128M)

3. **修改 `max_execution_time`**:这是 PHP 脚本允许运行的最大秒数。上传大文件时,如果脚本执行超时,上传会中断。对于大文件上传,建议设置一个较大的值。

- 原始内容:`max_execution_time = 30`

- 修改为:`max_execution_time = 300` (单位是秒,300 秒 = 5 分钟,足够上传几百兆的文件)

4. **(可选)修改 `memory_limit`**:如果上传的文件被 PHP 脚本处理(例如生成缩略图),可能还需要提高内存限制。但通常不是上传失败的直接原因,除非你遇到内存耗尽错误。

- 原始内容:`memory_limit = 128M`

- 修改为:`memory_limit = 256M` (如果上传的是超大文件且需要处理,可以适当调高)

**重要提示**:所有数值的单位可以是 `M`(兆字节)、`G`(吉字节)或 `K`(千字节)。注意不要写成小写 `m`,PHP 不识别小写单位。修改完成后,保存文件。在 nano 中按 `Ctrl+X`,然后按 `Y` 确认,再按回车。

### 步骤 3:修改 Nginx 或 Apache 的额外限制(如果适用)

仅仅修改 `php.ini` 并不总是足够的。如果你的网站运行在 Nginx 或 Apache 反向代理后面,这些 Web 服务器本身也有上传大小限制。

**场景 A:Nginx 服务器**

1. 找到 Nginx 的配置文件。通常在 `/etc/nginx/nginx.conf` 或 `/etc/nginx/sites-available/你的网站.conf`。

2. 使用编辑器打开该文件。

3. 在 `server` 块或 `location ~ \.php$` 块中,添加或修改以下指令:

```nginx

client_max_body_size 128M;

```

这个值应该与你设置的 `post_max_size` 一致或稍大。

4. 保存文件。

5. 测试 Nginx 配置是否正确:`sudo nginx -t`。

6. 如果测试通过,重新加载 Nginx:`sudo systemctl reload nginx` 或 `sudo nginx -s reload`。

**场景 B:Apache 服务器**

1. 找到 Apache 的配置文件,通常在 `/etc/apache2/apache2.conf` 或 `/etc/httpd/conf/httpd.conf`。也可能在虚拟主机配置文件(`/etc/apache2/sites-available/` 目录下)。

2. 打开文件,搜索 `LimitRequestBody` 指令。

3. 如果找到,将其修改为 0(表示不限制)或一个较大的值(单位是字节,例如 134217728 表示 128M):

```apache

LimitRequestBody 134217728

```

如果没有找到,可以添加在 `` 或 `` 块中。

4. 保存文件。

5. 重启 Apache:`sudo systemctl restart apache2` 或 `sudo systemctl restart httpd`。

### 步骤 4:重启 PHP 服务使配置生效

修改 `php.ini` 后,必须重启 PHP 服务,否则修改不会生效。重启方式取决于 PHP 的运行模式。

**场景 A:PHP 作为 Apache 模块(mod_php)**

- 重启 Apache 即可:

```bash

sudo systemctl restart apache2 # Debian/Ubuntu

sudo systemctl restart httpd # CentOS/RHEL

```

**场景 B:PHP-FPM(通常与 Nginx 配合使用)**

- 重启 PHP-FPM 服务:

```bash

sudo systemctl restart php8.1-fpm # 注意版本号,可能是 php7.4-fpm 或 php8.2-fpm

```

**场景 C:Windows 服务器**

- 如果 PHP 作为 IIS 的 FastCGI 模块运行,需要在 IIS 管理器中重启网站,或者重启 IIS 服务:在命令行运行 `iisreset`。

- 如果 PHP 作为 Apache 模块运行,重启 Apache 服务:在“服务”管理器中找到 Apache 服务,右键点击“重新启动”。

**场景 D:宝塔面板 / cPanel**

- 在宝塔面板中,点击软件商店 -> 已安装的 PHP 版本 -> 点击“重启”按钮。

- 在 cPanel 中,通常修改配置后会自动重启,如果没有,可以在“选择 PHP 版本”页面找到“重启”或“重新加载”按钮。

### 步骤 5:验证修改是否成功

1. 再次访问之前创建的 `info.php` 文件(如果已删除,请重新创建)。

2. 在页面中搜索 `upload_max_filesize`,查看其值是否已变为你设置的新值。

3. 同时检查 `post_max_size` 和 `max_execution_time` 是否也已更新。

4. 进行实际的上传测试:尝试上传一个接近新限制大小的文件(例如 50MB 的文件)。如果上传成功,则说明修改生效。

5. 测试完成后,**务必立即删除 `info.php` 文件**,以防止服务器信息泄露。

## 常见问题

**问题 1:修改了 php.ini 并重启了服务,但 phpinfo() 显示的值没有变化。**

- **原因**:你可能修改了错误的 `php.ini` 文件。PHP 可能有多个配置文件(例如 CLI 模式和 Web 模块模式)。请再次通过 `phpinfo()` 确认“Loaded Configuration File”路径,确保你编辑的是 Web 服务器正在使用的那个文件。

- **解决方法**:重新定位正确的 `php.ini` 文件并修改。

**问题 2:修改了 php.ini,但上传时仍然提示“文件过大”或直接报 500 错误。**

- **原因**:Web 服务器(Nginx/Apache)自己的上传限制没有修改。请检查并修改 `client_max_body_size`(Nginx)或 `LimitRequestBody`(Apache)。

- **解决方法**:按照步骤 3 操作,并重启 Web 服务器。

**问题 3:我的网站是 WordPress,修改了 php.ini 后还是无法上传大文件。**

- **原因**:WordPress 本身也有媒体上传限制,但通常受 PHP 限制影响。如果 PHP 限制已修改,请检查 WordPress 根目录下的 `.htaccess` 文件(如果使用 Apache)或主题/插件中是否额外限制了上传大小。此外,某些安全插件(如 Wordfence)也可能有上传限制。

- **解决方法**:暂时禁用所有插件,切换到默认主题再测试。如果问题解决,则逐个启用插件排查。

**问题 4:我使用的是虚拟主机,没有权限修改 php.ini 文件。**

- **原因**:共享主机通常不允许用户直接修改服务器级别的配置文件。

- **解决方法**:尝试在网站根目录下创建一个名为 `.user.ini` 的文件(注意前面有英文点号),并在其中写入以下内容:

```

upload_max_filesize = 64M

post_max_size = 128M

max_execution_time = 300

```

保存后,该文件会覆盖当前目录的 PHP 设置。如果主机不支持 `.user.ini`,请联系主机提供商请求提升限制,或者使用 cPanel 等面板中的“PHP 设置”功能。

**问题 5:修改后上传速度极慢,甚至超时。**

- **原因**:`max_execution_time` 设置得太小,或者网络带宽不足。另外,如果上传的文件非常大(例如 1GB),即使设置了 300 秒也可能不够。

- **解决方法**:适当增加 `max_execution_time` 的值(例如 600 或 1200),或者考虑使用分片上传插件/工具。

## 收尾总结

通过以上五个步骤,你已经系统地解决了 PHP 上传大小限制的问题。核心要点是:**同时修改 `upload_max_filesize`、`post_max_size` 和 `max_execution_time` 三个参数**,并且**确保 Web 服务器(Nginx/Apache)的对应限制也同步调整**。不要忘记在修改后重启 PHP 和 Web 服务器服务,并使用 `phpinfo()` 进行验证。如果遇到问题,请按照常见问题部分逐一排查。掌握这些技能后,你不仅能解决附件上传失败的问题,还能更深入地理解 PHP 与 Web 服务器的协作机制,为日后管理网站打下坚实基础。