我有以下设置:
因此,服务器B具有许多用户可以在需要时下载的数据。客户端向服务器A发送一个请求该文件的请求,服务器A通过SSH连接到服务器B并执行多个任务(包括解密和压缩),这些任务完成后,在服务器B上生成了一个zip文件,然后服务器A重定向使用header("Location: https://serverb.com/index.php?file=thefileiwant.zip")
发出的请求。
问题在于,如果有很多文件(我正在测试50个文件),则将zip文件下载为0个字节。对于少量文件,一切正常,因此我认为问题在于解密和压缩花费的时间太长,并且服务器只是发送空文件,因为请求超时...
我该如何解决?
编辑以添加更多信息:
已经增加了php_ini上的max_execution_time(尽管它似乎没有用,因为我在2分钟之前得到了0字节的zip。.
已将这些添加到文件中
ob_implicit_flush();
ini_set('max_execution_time','120');
header('Expires:0');
set_time_limit(0);
答案 0 :(得分:0)
如@IdontDownVote所述,问题不在于浏览器没有在等待,而是与ssh连接有关:
这是我压缩文件的方式:
ssh2_exec($connection, 'zip -j '.$path.$zipname.'.zip '.$path.'*.txt '.$path.'*.3gp');
问题在于,这只是将命令发送到服务器B并跳至下一行,因此zip文件从未完成。我意识到,当我看到几个带有名称模式的文件,例如zid5Jhn
而不是实际的zip文件(连同@IdontDownVote注释)
我使用我用来获取命令输出的功能解决了这个问题:
function get_command_return($connection, $command){
$stream = ssh2_exec($connection, $command);
stream_set_blocking($stream, true);
$stream_out = ssh2_fetch_stream($stream, SSH2_STREAM_STDIO);
return stream_get_contents($stream_out);
}
尽管我认为只需要行ssh2_exec(...) to get_command_return(...)
,但我通过更改stream_set_blocking($stream, true);
解决了问题
谢谢