HOWTO · PHP
PHP 中的最大上传大小
今天的帖子将介绍 PHP 中的最大上传大小。
本页内容
若要接受更大的上传文件,请提高 PHP 的单文件限制 upload_max_filesize,并将 post_max_size 设为足以容纳整个请求的值。首先确认处理上传的 PHP 进程使用哪份配置,然后在该配置中应用这些设置,并通过同一进程验证。配置文件的位置和重新加载步骤取决于 PHP 的安装与托管方式。
找到当前生效的 PHP 配置
PHP 可以从 php.ini 加载设置;命令行 PHP 使用的文件可能与 Web 服务器或 PHP-FPM 使用的文件不同。请检查接收上传的 PHP 进程所使用的配置。对于命令行 PHP,php --ini 会报告其已加载的配置文件。对于 Web 请求,可以用调用 php_ini_loaded_file() 的临时脚本识别已加载的文件;检查完后请删除该脚本,以免配置详情继续公开访问。
php.ini 通常保存某个 PHP 安装或运行环境的设置。某些 Web 服务器配置也允许通过 .htaccess 设置目录级覆盖,但这取决于服务器及其 PHP 集成方式。PHP 本身不提供 .htaccess,托管服务商也可能禁用此类覆盖。如果你无法管理相关文件或服务,请使用托管控制面板,或询问管理员哪些设置可以修改。
设置 upload_max_filesize
此指令限制单个上传文件的大小。请编辑当前生效的配置,并选择一个适合你计划接收的最大文件的值。例如,upload_max_filesize = 32M 会将单文件限制设为 32 兆字节。PHP 的大小值通常使用 K、M 或 G;请选择 PHP 配置和托管环境支持的值。不要假设示例值就是当前默认值,也不要认为修改它会影响服务器上的所有 PHP 运行环境。
为整个请求设置 post_max_size
post_max_size 限制整个 HTTP 请求正文的大小,其中包括 multipart 表单数据以及请求中的其他文件。请将它设得高于 upload_max_filesize,为表单字段和 multipart 开销留出余量。例如,单个文件限制为 32 兆字节时,将请求限制设为 40M 可以提供一些余量。如果请求限制过小,即使文件本身没有超过 upload_max_filesize,PHP 也可能不会将上传文件提供给应用程序。memory_limit 并非这两项设置必须遵守的上限;内存需求取决于应用程序如何处理上传内容。
应用更改
保存适用于接收上传请求的 PHP 进程的配置文件或覆盖设置。根据托管环境,更改可能立即生效,也可能需要重新加载或重启 Web 服务器、PHP-FPM 或其他 PHP 服务。请遵循该环境的操作流程;启动新的命令行 PHP 命令不需要重启 PHP,而长时间运行的服务可能需要重新加载。使用共享主机时,可能需要在控制面板中修改值,而不是编辑服务器文件。
验证实际生效的限制
请在处理上传的同一环境中检查这两个值。可以使用一个简短的 PHP 脚本查看该进程读取到的值:
此示例内容完整,但本数据包未提供执行验证。代码会以英文显示两个 PHP 指令名称及其值;这些指令名称在代码中保持原样。
本节中的代码以及显示的标签或输出仍为英文。
<?php
foreach (['upload_max_filesize', 'post_max_size'] as $name) {
echo $name, '=', ini_get($name), PHP_EOL;
}
通过相关 Web 运行环境运行该脚本,才能检查 Web 配置;在终端中运行则检查的是命令行 PHP。完成后请删除任何临时诊断页面。如果报告的值没有变化,请确认你编辑的是已加载的配置文件,并且已对正确的服务应用更改。
排查上传仍然失败的问题
如果上传被拒绝,请将文件大小与 upload_max_filesize 比较,并将整个请求的大小与 post_max_size 比较。类似“上传的文件超出了 upload_max_filesize 指令(位于 php.ini)”的错误指向 PHP 的单文件限制,但具体措辞可能不同。如果显示的限制仍然偏低,请检查已加载的配置文件,并确认相关服务是否已重新加载。如果 PHP 报告的值符合预期,其他层可能设有更小的限制,例如 Web 服务器、代理、托管平台或应用程序规则。请检查该层的设置和日志;如果无法自行调整限制,请联系托管服务商。保持请求限制高于单文件限制,并通过实际处理上传的同一路由和 PHP 运行环境重新测试。