我花了几个小时谷歌搜索,以及搜索Apache网站,我找不到任何关于Apache如何处理文件上传的文档 - 特别是大文件。我已阅读anecdotal reports,在上传完成之前,PHP不会参与,这正是我所期待的。但就Apache在上传过程中所做的事情而言,我找不到任何东西。
我热衷于文档的原因是Apache将上传完全存储在内存中,而不是将它们传输到磁盘。 httpd
将使用我正在使用的服务器上的每个可用内存字节,直到它崩溃。通常,所消耗的物理内存量是上传文件大小的3倍,并且在5 MB / s附近增加(远不及我的上传速度)。
我在我正在使用的另一个LAMP堆栈上测试了这个相同的请求,并且在整个上传过程中Apache内存使用量根本没有变化。
任何人都可以向我解释Apache如何在两台不同的服务器上以相同的方式处理相同的上传?任何想法都非常感激。
答案 0 :(得分:3)
从技术上讲,PHP 是代表Apache处理上传,并在ram中缓冲文件直到完成。但是,在上载完成(或中止)之前,您的脚本将无法获得控制权。除非必须,否则Apache本身不会缓冲到磁盘。可以把它想象成一个不可见的“handle_upload()”函数调用,它作为脚本中的第一个内容透明地插入。
回到“一切都是cgi脚本”的日子,当PHP等语言解释器未嵌入到Web服务器进程中时,POST数据通过标准输入发送到CGI脚本。文件将直接通过Apache传递给CGI进程并且可以在进入时逐字节地读取。
答案 1 :(得分:2)
答案令人不满意。我从未找到任何文件。
我继续在黑暗中徘徊,最终绊倒mod_fcgid
升级(从2.2到2.3.6),这就是诀窍。也许2.2中有一个错误。
内存使用率仍然在2.3.6上升,但远远不那么显着。 ~100 MB文件只有几兆字节。 (但是,当上传完成并移动文件时,内存使用量会立即上升~100-200 MB,但似乎会立即释放。)
答案 2 :(得分:0)
这可能会对您有所帮助,因为WAMP服务器中包含Apache。