是否可以强制 PHP 代码继续 运行,如果上传的文件超过此 php.ini 指令(例如 upload_max_filesize)?

Is it possible to force PHP code to continue running, if a php.ini directive such as upload_max_filesize is exceeded when uploaded file exceeds this?

我有一个 PHP 页面,页面顶部有 php (v7.4.7) 脚本。该页面用作文件上传器,每次上传最多 10 个文件,最大文件大小在脚本中设置。 该站点运行完美,为用户生成每个文件结果的 table。

也就是说,除非有人上传的文件大于 php.ini 文件中的 upload_max_filesize 指令。此时,脚本停止运行,因此无法继续向用户提供必要的结果。没有返回任何结果,结果 table 因此是空的,用户可能会错误地认为一切顺利。

我已经尝试添加 try/catch 个块,但脚本仍然无法完成。这是设计使然,还是有办法在超出此指令时将脚本强制为 run/complete? HTML/PHP 代码非常标准,如各种教程等所演示的那样

非常感谢。

违反upload_max_filesize 不会中止脚本执行。它只会导致 $_FILES 中的 error 键变成 UPLOAD_ERR_INI_SIZE.

很可能,您正在达到一个完全不同的极限。例如,Apache 有 LimitRequestBody和PHP本身就有post_max_size甚至max_file_uploads。通常,这些指令也不会中止脚本,而只是清除多余的数据。

我的建议是找到所有可能影响文件上传的指令,将它们一一设置为人为的低限制,并验证它们对您的数据有何影响。对于 $_SERVER['REQUEST_METHOD']POST$_POST 为空的请求,我通常执行的检查是验证 $_SERVER['CONTENT_LENGTH'] 是否大于零。除此之外,检查 $_FILES 中的 error 应该已经完全覆盖了。


; Allow enough time for the upload to complete
max_input_time = 1200
; Max file size
upload_max_filesize = 50M
; Greater than upload_max_filesize to ease diagnose slightly large files
post_max_size = 100M
if (
    empty($_FILES) &&
    empty($_POST) &&
    isset($_SERVER['REQUEST_METHOD']) &&
    strtolower($_SERVER['REQUEST_METHOD'])=='post'
) {
    // Error: post body was too large
    // Bytes sent (and discarded): filter_input(INPUT_SERVER, 'CONTENT_LENGTH')
} elseif (
    isset($_FILES['foo']) &&
    $_FILES['foo']['error'] != UPLOAD_ERR_NO_FILE
){
    // Upload
    if ($_FILES['foo']['error'] === UPLOAD_ERR_OK) {
        // Successful upload
    }else{
        // Failed upload
    }
} else {
    // No upload
}