如何使用 PHP 在 XAMPP 中上传大文件(超过 1GB)?更改“post_max_size”等的值对我不起作用。有什么解决办法吗?

How do I upload big files (more than 1GB) in XAMPP using PHP? changing value of 'post_max_size' etc not worked for me. Is there any solution?

提问人:mr.biratpdl 提问时间:8/25/2023 最后编辑:mr.biratpdl 更新时间:8/25/2023 访问量:77

问:

我需要通过 php using 和 functions 在 xampp 中上传更大的文件。1GB以下的文件上传成功。请参阅快照,但无法上传超过 1 GB 的文件。我重新更改了“php.ini”文件中的相关变量,但无法做到这一点。浏览器显示:“连接已重置”,页面断开连接 请参阅下一个快照。 我更改了变量如下:$_FILES[]move_uploaded_file()

post_max_size = 11000M
upload_max_filesize = 10000M
max_execution_time = 36000
max_input_time = 36000
memory_limit = 15000M

我怎样才能在我的 Xampp Server 的本地主机中通过 php 上传超过 1GB 的文件?

PHP 文件 XAMPP

评论

0赞 CBroe 8/25/2023
您可能还需要修改一些 Web 服务器设置 - 例如,apache 配置的指令与此非常相关。LimitRequestBody
0赞 Community 8/25/2023
请澄清您的具体问题或提供其他详细信息,以准确说明您的需求。正如目前所写的那样,很难确切地说出你在问什么。
0赞 Nico Haase 8/25/2023
你确定PHP抛出了这个错误吗?如果没有,这个问题可能更贴近 serverfault.com
0赞 mr.biratpdl 8/25/2023
php 代码中没有错误。如果出现错误,则文件未上传到 1 GB 以下。
0赞 Nico Haase 8/25/2023
如果PHP不是罪魁祸首,为什么会用PHP标记呢?

答:

-1赞 beerwin 8/25/2023 #1

正如许多人在评论中所说,您很可能超出了 xampp 堆栈配置中设置的一项或多项限制。要么你必须改变你的php设置,或者你必须更新Web服务器设置(apache或nginx设置)。您需要检查许多配置变体(列表不完整):

PHP是如何配置的:

  • 如果是 FPM,您应该检查您的 PHP-FPM 配置
    • 检查并设置 Web 服务器和 PHP 进程之间的连接超时(因为有一个) - 它位于该特定站点的 nginx php-fpm 设置中
  • 如果PHP作为Apache模块加载,则配置完全不同(需要检查apache配置或虚拟主机配置)
  • FastCGI 还有另一组配置(很可能是全局的,但它可能是特定于站点的)

如果您对不涉及修改技术堆栈配置的解决方案感兴趣,那么有一个:分块上传。

一次性上传大文件通常不是一个好主意。您应该考虑分块进行。如果用户必须等待 30 分钟左右才能完成上传并在最后一分钟失败,会发生什么情况?虽然分块上传需要同样多的时间,但您将拥有更好的控制权和更多完成工作的机会。

与单体(一次)上传相比,它具有以下优点:

  • 容错可以实现:
    • 当一个区块失败时,你不必重新上传整个文件,只需重新上传失败的区块
    • 当一个块失败时,你可以默默地重复它,而不会打扰用户(UX非常出色)
  • 可以使其适应服务器限制,例如最大帖子大小、内存限制和其他设置(可以设置块大小以适应这些限制),便于上传任何大小的文件。
  • 可以提供进度条(成功上传区块时会更新)
  • 可以异步执行:
    • 可以委托给工作线程
    • 可以同时上传多个块(服务器端应该能够处理:当所有块都成功上传后,进行合并)

笔记:

  • 此答案不包含代码,因为分块上传并非易事。此外,还有很多库/实现可用。他们中的大多数都是固执己见的,我让你选择最合适的(谷歌搜索会给你很多结果)。chunked uploads library with Javascript/PHP

  • 这里提供了最基本的知识,但这本身是不够的。AJAX/PHP - 以纯 javascript 分段上传大文件。链接问题的答案不包含对失败块和其他错误的缓解措施,它只是显示了通用的想法。


所以你需要做的是:

客户端:

  • 选择文件后,将其分解为小块(~500KB - 5MB 大小)
  • 遍历这些块并通过 AJAX/XMLHttpRequest 逐个发布它们
  • 如果任何请求失败,请对相应的块重复上传合理的次数(容错)
  • 一直做下去,直到你用完了块
  • 此处介绍的步骤不包括安全性(验证等),但永远不应忘记这一点。

服务器端

  • 终结点应能够处理:
    • 上传开始/第一个区块
    • 上传结束/最后一个区块
    • 其余块
  • 首先,在某处(文件/数据库)创建一个清单,用于存储您当前的上传状态:
    • 总块数,
    • 成功上传块(及其顺序),
    • 当前区块
    • 块属于哪个文件/上传会话(以防止将其与其他上传的块混合)
  • 最后,Chunk 以正确的顺序连接块并将它们保存到文件中
  • 成功上传特定块后,更新每个块的状态
  • 为任何故障提供正确的错误输出(如果任何块失败,则必须依赖错误信息。您可以向用户提供有意义的错误消息和/或您可以根据错误采取行动)