我正在尝试通过PHP提供任意大文件。 由于我需要先检查权限,我不能让Web服务器直接处理文件下载。
服务器正在运行Plesk 17.0。据我所知,Plesk默认使用Nginx作为Apache的代理。但是这可以关闭,所以Apache直接提供所有东西。
我的问题: 在下载时,如果我使用默认配置(运行Nginx时),1GB后会出现几MB的网络错误。
我已经阅读了很多关于如何在PHP中处理大文件上传的建议。目前我基本上使用这个:
if ( isset( $_SERVER['MOD_X_SENDFILE_ENABLED'] ) && $_SERVER['MOD_X_SENDFILE_ENABLED'] == 1 ) { header( "X-Sendfile: " . $this->options['base_path'] . $file ); } else { readfile( $file ); }
如您所见,我已尝试将文件下载卸载到Apache。它也可以正常工作,如果我关闭了Nginx。 打开Nginx后,PHP中的max_execution_time标记了Nginx产生网络错误的限制。虽然它至少服务1GB。对我来说,似乎Apache和Nginx之间存在某种块大小限制,设置为1GB。但我找不到这样的选择。例如,将max_execution_time设置为5秒,即使下载需要10分钟,仍然可以提供1GB。
当提供1GB且传递max_execution_time时,在proxy_error_log中记录此错误:
[error] 3524#0: *796853 upstream prematurely closed connection while reading upstream
在Apache直接服务且mod_xsendfile处于活动状态时,max_execution_time无关紧要。使用PHP readfile,max_execution_time很重要。这对我来说也很有意义。
但根据Plesk documentation,使用Nginx进行服务是有益的。
因此,我正在寻找一种方法来保持Nginx和Apache的运行,并且在提供多个GB文件时不受max_execution_time的限制。