如何强制浏览器等到php服务器发送响应?

时间:2018-10-02 20:10:41

标签: php apache timeout

我有以下设置:

  • 客户端:浏览器
  • 服务器A:托管我的PHP应用程序的服务器
  • 服务器B:存储服务器

因此,服务器B具有许多用户可以在需要时下载的数据。客户端向服务器A发送一个请求该文件的请求,服务器A通过SSH连接到服务器B并执行多个任务(包括解密和压缩),这些任务完成后,在服务器B上生成了一个zip文件,然后服务器A重定向使用header("Location: https://serverb.com/index.php?file=thefileiwant.zip")发出的请求。

问题在于,如果有很多文件(我正在测试50个文件),则将zip文件下载为0个字节。对于少量文件,一切正常,因此我认为问题在于解密和压缩花费的时间太长,并且服务器只是发送空文件,因为请求超时...

我该如何解决?

编辑以添加更多信息:

  • 生成的文件只有4mb,所以我认为这不是问题。
  • 已经增加了php_ini上的max_execution_time(尽管它似乎没有用,因为我在2分钟之前得到了0字节的zip。.

  • 已将这些添加到文件中

    ob_implicit_flush();

    ini_set('max_execution_time','120');

    header('Expires:0');

    set_time_limit(0);

1 个答案:

答案 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);解决了问题

谢谢